2016-11-17 90 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

這正是問題所在,我的查詢比較複雜,因爲在實體中我有一個連接表,而不是數據庫中的一列,以前的文章是成功的答案。不管怎樣,謝謝你 –