带有HAVING COUNT子句的mysql查询

时间:2013-05-17 13:17:34

标签: mysql sql database

所以,我有一个特定的查询,我正在尝试调整一下。对项目的需求有所改变,我不知道如何处理这个问题。

我有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的当前减去字符串,再加上这些标签的权重,我该如何处理它?

1 个答案:

答案 0 :(得分: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 ;

最大的区别是在case子句中使用count(distinct)语句。