SQL:多对多关系,IN条件

标签 sql select join many-to-many inner-join

我有一个名为事务的表,通过 items_transactions 表与项目具有多对多关系。

我想做这样的事情:

SELECT "transactions".* 
  FROM "transactions" 
INNER JOIN "items_transactions" 
        ON "items_transactions".transaction_id = "transactions".id 
INNER JOIN "items" 
        ON "items".id = "items_transactions".item_id 
WHERE (items.id IN (<list of items>))

但这给了我所有与列表中的一个或多个项目相关联的交易,我只希望它给我与所有这些项目相关的交易。

任何帮助,将不胜感激。

最佳答案

您必须扩展对列表中所有项目的查询:

SELECT "transactions".* 
FROM "transactions" 
WHERE EXISTS (SELECT 1 FROM "items_transactions"
              INNER JOIN "items" ON "items".id = "items_transactions".item_id 
              WHERE "items_transactions".transaction_id = "transactions".id
              AND "items".id = <first item in list>)
AND   EXISTS (SELECT 1 FROM "items_transactions"
              INNER JOIN "items" ON "items".id = "items_transactions".item_id 
              WHERE "items_transactions".transaction_id = "transactions".id
              AND "items".id = <second item in list>)
...

您也可以使用 IN 按摩它。和 COUNT DISTINCT ,我不确定哪个会更快。类似的东西(完全未经测试):
SELECT "transactions".* 
FROM "transactions" 
INNER JOIN (SELECT "items_transactions".transaction_id 
            FROM "items_transactions"
            INNER JOIN "items" ON "items".id = "items_transactions".item_id 
            WHERE "items".id IN (<list of items>)
            GROUP BY "items_transactions".transaction_id
            HAVING COUNT(DISTINCT "items".id) = <count of items in list>) matches ON transactions.transaction_id = matches.transaction_id

关于SQL:多对多关系,IN条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2965035/

相关文章:

sql - 在 Oracle 11g 上双查询的性能如何

php - WHERE 子句 0 结果

R data.table 连接 : SQL "select *" alike syntax in joined tables?

SQL 内连接两个以上的表

android - 如何将口音插入到 android 中的 sqlite 表中?

mysql - 帖子的多重评级系统(喜欢,爱,星)

sql-server - 如何在SQL Server数据库的多个表中查找匹配的列?

sql - 按日期条件分组

c - 帮助选择?

mysql - 删除左表上的重复项,同时保留右表上的重复项 SELECT JOIN