使用HAVING COUNT子句的MySQL查询

4
所以,我有一个特定的查询需要微调一下。 项目需求有些变化,我不确定如何处理。
我有3个表 - 一个主表,一个“标签”表,然后是用于将标签链接到主条目的链接表。 这个问题在于给这种链接赋予了一个权重,并且这个权重用于统计与主表中特定名称条目相关联的标签的总权重。简而言之,一个主条目可能有多个标签,每个标签具有不同的权重。当前查询会对所有标签进行加权求和,并按所有标签的总和排序。
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字符串,再加上这些标签的权重,我该如何做?

1个回答

2

我认为您的查询的正确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 语句。


在(1,2)部分的末尾)=2,这个2是指它之前的(1,2)部分中有多少个数字吗? - jpea
@jpea……是的,那就是计数。你原始查询只是在那个集合中寻找一个匹配项。既然你想要所有的匹配项,你应该使用“2”而不是“1”。 - Gordon Linoff
抱歉,还有一个问题 - 那么(2,1,3,4)部分,是否包括所有标签ID,无论它们是否应该是减法? - jpea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接