【问题标题】:Select from database based on multiple occurrences in junction table根据联结表中的多次出现从数据库中选择
【发布时间】:2021-03-07 04:02:09
【问题描述】:

您能否帮助我找到从数据库中选择某些数据的正确方法 - 基于联结表中的多次出现?

我正在使用 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 node.js postgresql express sequelize.js


    【解决方案1】:

    在 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
    

    【讨论】:

    • 感谢您的指出。你的回答把我推向了正确的方向。 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多