[英]mysql query with HAVING COUNT clause
因此,我有一个特定的查询正在尝试调整。 该项目的需求有所变化,我不确定该如何处理。
我有3个表-一个主表,一个“标签”表,然后是一个链接表,用于将标签绑定到主条目。 折中之处在于,对该链接赋予了权重,该权重用于求和链接到主表中特定Name条目的标签的总权重。 简而言之,一个主条目上可能有多个标签,每个标签的权重都不同。 当前查询对所有标签权重求和,并按所有标签的总和对它们进行排序。
UID | Name
-----------------
123 | Robert
UID | Tag_Name
-----------------
1 | Name_One
2 | Name_Two
Tag_ID | Name_ID | Weight
-----------------------------
2 | Name_One | 2
1 | Name_Two | 3
1 | Name_One | 5
目前,我已经构建了它,可以很好地实现,其中2,1是我要匹配的标签ID的字符串:
SELECT person.id,
SUM(linkage.weight) AS total_weight
FROM (person)
INNER JOIN linked_tags AS linkage
ON linkage.track_id = person.id AND linkage.tag_id IN (2,1)
GROUP BY person.id
HAVING COUNT(DISTINCT linkage.tag_id)=1
ORDER BY total_weight DESC
我想将此扩展为其他用途。 现在,以字符串形式传递的标签ID为减号。 它仅在某个人员ID的两个标签ID都存在的地方找到匹配项。 如果我想传入另一个ID字符串,如果任何人ID都与该标签ID中的任何一个都不匹配,再加上当前ID的减法字符串,再加上这些标签的重量,我该怎么做?
我相信您查询的正确的having
子句是:
HAVING COUNT(DISTINCT linkage.tag_id)=2
您的版本恰好找到1个标签。
以下版本的查询的标签3和4是可选的:
SELECT person.id, SUM(linkage.weight) AS total_weight
FROM person INNER JOIN
linked_tags AS linkage
ON linkage.track_id = person.id AND
linkage.tag_id IN (2, 1, 3, 4)
GROUP BY person.id
HAVING COUNT(DISTINCT case when linkage.tag_id in (1, 2) then linkage.tag_id end) = 2
ORDER BY total_weight DESC ;
最大的区别是在count(distinct)
子句中使用了case
语句。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.