2017-05-29 40 views
2

所以,我有一個客戶端表和標籤表。 一個客戶端有很多標籤。 我想選擇所有客戶端,它們都有特定的標籤集。 例如,讓我們選擇所有客戶端,有ID爲1和9MySQL:Array comparsion

SELECT clients.id from clients 
INNER JOIN tags ON clients.id = tags.client_id 
WHERE tags.id IN (1, 9) 
GROUP BY clients.id 

這個標籤對我來說是不行的,因爲這樣的查詢將返回有1,9,或兩者1,9

所有客戶端

我該如何才能返回只有1和9的客戶?

+0

雙重加入...? –

+0

@Jens:確實如此,但事實並非如此。 –

+0

顯示樣本數據 – Jens

回答

1

您可以採用如下方案,使用HAVING

SELECT clients.id FROM clients 
INNER JOIN tags ON clients.id = tags.client_id 
WHERE tags.id IN (1, 9) 
GROUP BY clients.id 
HAVING COUNT(DISTINCT tags.id) = 2 

演示:http://sqlfiddle.com/#!9/7e4d20/1/0

此查詢僅返回具有行兩個(1和9不是1或9)標籤。如果您更改IN上的標籤數量,則必須更改HAVING的編號。

+0

這對我很有用,謝謝! –

1

即使你已經接受了答案,這裏是另一種變體:

SELECT clients.id 
FROM clients 
LEFT JOIN tags ON clients.id = tags.client_id 
WHERE tags.id IN (1, 9); 
+0

謝謝,它也看起來不錯! –

+0

@LuninRoman不客氣。請記住:如果你以「_I想要所有客戶端... _」開頭,那麼'clients'是LEFT上的「主」表,並且其所有記錄將被顯示(如果需要,則通過'WHERE'子句過濾)。而且,如果您繼續使用「_that tags ... _」,那麼您可以將「標籤」細節加入其中的每條記錄。所以:'tags'細節將被連接到左表。 – 2017-05-29 13:57:18