現在のクエリを少し変更して、必要な結果を得ることができます:
SELECT i.id, i.name -- OK to select name assuming id is the PK
FROM item i
LEFT JOIN relation r
ON i.id = r.item_id
LEFT JOIN tag t
ON t.id = r.tag_id
WHERE t.tag IN ('sport', 'leather')
GROUP BY i.id
HAVING COUNT(DISTINCT t.tag) = 2;
これにより、両方のsport
を持つすべてのアイテムが返されます。 およびleather
タグ。これは、(すでに行っていたように)アイテムごとに集約することで機能しますが、HAVING
でアサートします。 2つの異なる一致するタグがあるという句。 WHERE
ではこれら2つのタグのみに制限したため HAVING
の場合、句 チェックは集計後に合格します。これは、アイテムが一致していることを意味します。