sql - 根据联结表中的多次出现从数据库中选择
问题描述
你能帮我找到从数据库中选择一些数据的正确方法吗——基于连接表中的多次出现?
我使用 Sequelize ORM,但纯 SQL 也可以。查询应该是动态的——基于用户的输入。虽然,在这一点上,即使是静态解决方案也会非常有帮助。
我将使用一些示例来更好地描述我在这里面临的问题:
我有两张表——假设一张用于订单,第二张用于产品(订单、产品)。每个订单可以包含多个产品,每个产品可以关联多个订单。我在这些表之间使用 order_product (OrderProduct) 作为连接表(其中包含一些额外的字段,而不是订单和产品的 ID - 例如产品数量):
Order.belongsToMany(Product, { through: OrderProduct });
Product.belongsToMany(Order, { through: OrderProduct });
我的问题是——我如何从数据库中获取包含的所有订单——例如——ID = 1 的产品,ID = 2 的 AND 产品,ID = 3 的 AND 产品?
使用 Sequelize 或普通 SQL 最优雅的解决方案是什么?
我在 Sequelize 中
尝试了include语句,但在这种情况下我未能正确使用它。
另一方面,普通 SQL 中的许多“EXISTS”语句(一个接一个)可能太贵了?
谢谢!
解决方案
在 SQL 中,您将有一个名为OrderProducts
. 然后你可以使用聚合和having
:
select op.orderId
from orderProducts op
where op.productId in (1, 2, 3)
group by op.orderId
having count(*) = 3; -- number of product
如果一个产品可以多次出现在一个订单中,那么使用:
having count(distinct op.productId) = 3
推荐阅读
- shell - Tmux 发送键删除分号
- ios - 如何在横向模式下使用 SwRevealController 只有一个菜单?
- angular - 角度变量绑定在页面/浏览器重新加载时不起作用,但在浏览路线时起作用
- corda - 关闭 devMode 后使用自己的证书时出现节点启动问题
- entity-framework - ADO.net 和 EFW 有什么替代方案吗?
- git - 为什么`git cherry-pick --allow-empty`没有效果?
- c - 我是否需要在我的字符串数组中包含终止字符的空间?
- javascript - redux 异步示例不适用于 firefox
- r - 在 rpanel 中显示一个带有间隔的按钮
- search - AutoIt PixelSearch 不适用于游戏