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

时间:2016-05-16 13:08:33

标签: php mysql

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

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

2 个答案:

答案 0 :(得分:2)

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

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应该能够轻松优化它。

答案 1 :(得分:1)

List<string> list = new List<string>(); list.Add("Dubai"); list.Add("Sarjah"); list.Add("Dubai"); list.Add("Lahor"); list.Add("Dubai"); list.Add("Sarjah"); list.Add("Sarjah"); int most = list.GroupBy(i => i).OrderByDescending(grp => grp.Count()) .Select(grp => grp.Count()).First(); IEnumerable<string> mostVal = list.GroupBy(i => i).OrderByDescending(grp => grp.Count()) .Where(grp => grp.Count() >= most) .Select(grp => grp.Key) ; 替换为WHERE,如:

INNER JOIN

更新,如果我找到了你,并且你想只得到所有3个标签的客户:

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