Bạn có thể thay đổi một chút truy vấn hiện tại của mình để nhận được kết quả bạn muốn:
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;
Điều này sẽ trả về tất cả các mục có cả sport
và leather
các thẻ. Nó hoạt động bằng cách tổng hợp theo mục (như bạn đã làm), nhưng sau đó xác nhận trong một HAVING
mệnh đề có hai thẻ phù hợp riêng biệt. Vì chúng tôi chỉ giới hạn hai thẻ này trong WHERE
mệnh đề nếu HAVING
séc chuyển qua sau khi tổng hợp, điều đó ngụ ý rằng mục là một đối sánh.