我试图创建一个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)

意思是我的客户拥有所有的标签:tag1,tag2,tag3。
如果我尝试执行最后一个查询,则会出现以下错误: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应该能够轻松地优化这一点。

10-01 04:26
查看更多