我正在尝试创建一个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