首页 > 解决方案 > 根据联结表中的多次出现从数据库中选择

问题描述

你能帮我找到从数据库中选择一些数据的正确方法吗——基于连接表中的多次出现?

我使用 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”语句(一个接一个)可能太贵了?

谢谢!

标签: sqlnode.jspostgresqlexpresssequelize.js

解决方案


在 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

推荐阅读