繁体   English   中英

使用HAVING COUNT子句的mysql查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM