我有两张桌子
一个曲目有很多标签
我想要包含两个标签的曲目列表示例tag_id 1和tag_id 2
SELECT * FROM tracks
LEFT JOIN tags ON tracks.tag_id = tags.id
WHERE tags.id in (1,2)
GROUP BY track.id
HAVING count(tags.id) = 2
如果曲目有标签1和3,则会出现问题。
有什么帮助吗?
答案 0 :(得分:0)
将distinct
添加到计数
SELECT track.id FROM tracks
LEFT JOIN tags ON tracks.tag_id = tags.id
WHERE tags.id in (1,2)
GROUP BY track.id
HAVING count(Distinct tags.id) = 2
您可以将LEFT JOIN
更改为INNER JOIN
,因为它会根据您的Where子句隐式转换
答案 1 :(得分:0)
您的代码应该按照您的意愿执行。我会把它写成:
SELECT track.id
FROM tracks INNER JOIN
tags
ON tracks.tag_id = tags.id
WHERE tags.id in (1, 2)
GROUP BY track.id
HAVING count(tags.id) = 2;
注意:
LEFT JOIN
条款将INNER JOIN
变为WHERE
。你可能也是具体的。track
中有重复项,那么您希望使用COUNT(DISTINCT)
而不是COUNT()
。实际上,这可以进一步简化为:
SELECT t.id
FROM tracks t
WHERE t.tag_id in (1, 2)
GROUP BY t.id
HAVING count(t.id) = 2;
根本不需要JOIN
,因为您在tracks.tag_id
中拥有所需的信息。