按标签出现组的mysql顺序

时间:2014-10-09 20:24:00

标签: mysql

我不确定这个问题是否已在本网站的其他地方得到解答,但我很难用语言解释我的问题。 这里是: 我想要做的是通过用户选择的标签在crawler_results中订购文章。因此,文章中出现的标签越多(count_tags越大),层次结构就越高。

我有4个表:crawler_results(我存储文章的地方),标签(我存储标签名称的地方),article_tags(我存储tag_id和标签的出现次数)和user_tags(我存储user_id和tag_id的地方)

我试过了:

      SELECT cr.id, title, count_tags, t.tag
      FROM crawler_results cr
      INNER JOIN article_tags at
      ON cr.id = at.article_id
      INNER JOIN tags t
      ON t.id = at.tag_id
      INNER JOIN user_tags ut
      ON ut.tag_id = at.tag_id
      AND user_id = '$user_id'
      ORDER BY count_tags DESC

此查询显示按count_tags排序的文章,但不幸的是,它使用文章包含的所有标记。例如,如果一篇文章是这样的:“Stackoverflow溢出真棒!”并且用户选择“stack”和“overflow”作为标记,“overflow”应该是查询所看到的唯一标记,因为它看起来比“stack”更多。

我觉得它与GROUP BY有关 - 我是对的吗?我只是不知道它是如何运作的。

提前致谢! 如果您需要更多信息,请与我们联系。

编辑: 这是我的表格:

crawler_results:

       | id         | title       | content      |
       |:-----------|------------:|:------------:|
       | 1          | Some title  | Some content |
       | 2          | Other title | Other content|

标记:

       | id         | tag         | 
       |:-----------|------------:|
       | 1          | Some tag    |
       | 2          | Other tag   | 

article_tags:

       | id         | tag_id      | article_id   | count_tags   |
       |:-----------|------------:|:------------:|:------------:|
       | 1          | 1           | 1            | 5            |
       | 2          | 2           | 2            | 10           |
       | 3          | 1           | 2            | 8            |

user_tags:

       | id         | user_id     | tag_id       |
       |:-----------|------------:|:------------:|
       | 1          | 1           | 1            |
       | 2          | 1           | 2            |

1 个答案:

答案 0 :(得分:0)

以下是似乎返回预期结果的查询:

SELECT cr.id
    , cr.title
    , SUM(CASE
           WHEN ut.tag_id IS NOT NULL THEN at.count_tags
           ELSE 0
          END) AS matching_tags
FROM crawler_results cr
INNER JOIN article_tags at ON cr.id = at.article_id
LEFT JOIN user_tags ut ON ut.tag_id = at.tag_id
                         AND user_id = '$user_id'
GROUP BY cr.id, cr.title
ORDER BY matching_tags DESC

我刚刚添加了一个GROUP BY子句来计算每篇文章的标签数量,然后我将结果降序排序。

希望这会有所帮助。