2016-11-17 65 views
1

的确切数目我有两个表选择上加入表itmes

  • 轨道
  • 标签

赛道有许多标签

我想有曲目列表同时具有两个标签示例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

添加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子句

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 JOINWHERE条款变成了INNER JOIN。你可能是特定的。
  • 如果您有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需要的信息。

+0

这正是问题所在,我的查询比较复杂,因为在实体中我有一个连接表,而不是数据库中的一列,以前的文章是成功的答案。不管怎样,谢谢你 –