在连接表上选择具有确切数量的itmes

时间:2016-11-17 16:32:32

标签: mysql sql database

我有两张桌子

  • 轨道
  • 标记

一个曲目有很多标签

我想要包含两个标签的曲目列表示例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,则会出现问题。

有什么帮助吗?

2 个答案:

答案 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中拥有所需的信息。