2017-05-29 50 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