我正在尝试创建一个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]
因此每个客户端可以有多个标签,我只想检索具有所有给定标签的客户端。
答案 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")