SQL:多对多关系,IN条件

Maa*_*ten 7 sql select many-to-many join inner-join

我有一个名为Transactions的事务表,它通过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>))
Run Code Online (Sandbox Code Playgroud)

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

任何帮助,将不胜感激.

lc.*_*lc. 10

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

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>)
...
Run Code Online (Sandbox Code Playgroud)

您可能还可以按摩它使用INCOUNT 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
Run Code Online (Sandbox Code Playgroud)