有两个表:
Packages
id name
1 red
2 blue
3 yellow
Contents
packageid item size
1 square A
1 circle B
1 triangle C
2 square A
2 circle B
3 square A
如果我们查询{ item:square, size:A }
,我们只想要{ packages.id:3 }
如果我们查询{ item:square, size:A }
和{ item:circle, size:B }
,我们只需要{ packages.id:2 }
如果我们查询{ item:square, size:A }
、{ item:circle, size:B }
和{ item:triangle, size:C }
,我们只需要{ packages.id:1 }
如果有多个完全匹配的包裹,我们希望所有的包裹都匹配.
这似乎很管用,但并不是特别优雅:
SELECT
p.id,
p.name,
c.item,
c.size
FROM Packages p
LEFT JOIN Contents c ON (
c.packageid=p.id
)
WHERE (
( p.id IN ( SELECT packageid FROM Contents WHERE item='square' AND size='A' )
AND
( p.id IN ( SELECT packageid FROM Contents WHERE item='circle' AND size='B' )
)
GROUP BY p.id
HAVING ( SELECT COUNT(*) FROM Contents WHERE packageid=p.id ) = 2;