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 字符串,加上这些标签的权重,我该怎么做?

4

1 回答 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 ;

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

于 2013-05-17T13:29:00.850 回答