【问题标题】:mysql order by tag occurrence group bymysql order by 标签出现组 by
【发布时间】:2014-10-09 20:24:00
【问题描述】:

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

我有 4 个表:crawler_results(我存储文章的地方)、tags(我存储标签名称的地方)、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            |

用户标签:

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

【问题讨论】:

  • 查看替换和长度
  • 我有文章中标签出现的计数,现在我只需要按这个出现来排序:)
  • 好吧,如果您愿意,请考虑遵循这个简单的两步操作: 1. 如果您还没有这样做,请提供适当的 DDL(和/或 sqlfiddle),以便我们可以更多轻松复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。
  • 嗨草莓,我不确定如何使用 sqlfiddle,但我已经用我的数据库表更新了我的问题 :)

标签: mysql


【解决方案1】:

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

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 子句,以便计算每篇文章的标签数量,然后我对结果进行降序排序。

希望这会有所帮助。

【讨论】:

  • 嗨乔尔萨拉明!您不需要将“AND”替换为“WHERE”以仅获取用户选择的标签吗?因为我测试了您的代码并返回所有标签,而不仅仅是用户选择的标签。我尝试使用 WHERE,但这也不起作用 - 它返回最低的 count_tags 而不是最高的。顺便说一句,标签的出现已经被计算过了,所以不需要 COUNT(ut.tag_id),只需:at.count_tags
  • @MathiasLund 感谢您提供更多信息。我没有注意到您的一个表中已经有一个名为 count_tags 的列,这可能会导致我的 ORDER BY 子句出现问题...除了这一点,我的查询似乎是正确的,因为您正在寻找用于用户定义的标签数量,以便对结果进行排序。具有最多匹配标签的文章在顶部,没有对应的文章在结果的底部(我编辑了查询以应用正确的排序条件)
  • 查询按行数排序,而不是按count_tags。我更喜欢这些行是否按 count_tags 排序,因为它已经在文章中出现了标签。它计算“article_id”中出现“tag_id”的次数。
  • 好吧,我用count函数来统计用户标签和文章标签的对应数,我以为是你要找的信息
  • 我,我只是已经有了article_id(count_tags)中tag的出现次数。我用php插入事件,所以我只需要按标签出现次数最多的文章排序:)
猜你喜欢
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 2015-02-26
  • 2012-05-06
  • 2021-02-22
相关资源
最近更新 更多