MySQL的多个元素匹配其中(A,B,Z)IN(A,C,E,Z)


MySQL multiple elemnts match where (A, B, Z) IN (A,B,C,E,Z)

我正在尝试创建一个MySQL查询,该查询获取数据库中具有所有给定标记的所有行。

目前我有这个:

 WHERE "tag1" IN (SELECT tag FROM tag_list WHERE client.id = tag_list.id)

这适用于一个标签,但如果我有多个标签,我不想多次复制粘贴此查询并将其与AND连接,因为多次选择所有标签似乎很慢。

有什么办法让我做这样的事吗?

 WHERE ("tag1", "tag2", "tag3") IN (SELECT tag FROM tag_list WHERE client.id = tag_list.id)

这意味着我的客户拥有所有标签:标签1、标签2、标签3

如果我尝试执行最后一个查询,我会得到以下错误:Operand should contain 3 column(s)

所以,我目前的解决方案是这样的:

WHERE "tag1" IN (SELECT tag FROM tag_list WHERE client.id = tag_list.id)
AND "tag2" IN (SELECT tag FROM tag_list WHERE client.id = tag_list.id)
AND "tag3" IN (SELECT tag FROM tag_list WHERE client.id = tag_list.id)

这似乎根本不是最佳选择。

表格结构:

client [id, name]
tag_list [FK id references client.id, tag]

因此,每个客户端都可以有多个标记,我只想检索具有所有给定标记的客户端。

省略子查询,你应该很好:

JOIN tag_list tag1 ON client.id = tag1.id AND tag1.tag = "tag1"
JOIN tag_list tag2 ON client.id = tag2.id AND tag2.tag = "tag2"
JOIN tag_list tag3 ON client.id = tag3.id AND tag3.tag = "tag3"

我真的想不出比这更有效的方法了。Mysql应该能够很容易地对此进行优化。

INNER JOIN替换WHERE,如:

INNER JOIN tag_list 
ON client.id = tag_list.id
 AND  tag_list.tag IN ("tag1","tag2","tag3")

UPDATE,如果我没有弄错,并且您只想获得具有所有3个标签的客户端:

INNER JOIN tag_list 
ON client.id = tag_list.id
 AND  tag_list.tag IN ("tag1","tag2","tag3")
GROUP BY client.id
HAVING COUNT(DICTINCT tag_list.tag)=3