Sie können Ihre aktuelle Abfrage leicht ändern, um die gewünschten Ergebnisse zu erhalten:
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;
Dies würde alle Artikel zurückgeben, die beide sport
haben und leather
Stichworte. Es funktioniert, indem es nach Element aggregiert (wie Sie es bereits getan haben), aber dann in einem HAVING
bestätigt wird Klausel, dass es zwei unterschiedliche übereinstimmende Tags gibt. Da wir uns auf nur diese beiden Tags im WHERE
beschränkt haben Klausel, wenn die HAVING
Prüfung nach der Aggregation erfolgreich ist, impliziert dies, dass das Element eine Übereinstimmung ist.