【问题标题】:How to get the overall most popular tags from normalized tables?如何从规范化表中获取总体最受欢迎的标签?
【发布时间】:2016-02-22 21:29:02
【问题描述】:

在我的网站上,我有三个大版块:人们可以开始讨论的版块、人们可以分享故事的版块和包含我自己撰写的文章的博客。我已经使用下面的数据库结构构建了一个自定义标记系统。

在我的 tags_xref 表中,我需要为每种帖子类型设置 3 个不同的列,因为讨论可以与故事或文章具有相同的 ID。

一切都按应有的方式工作,但我在查询显示某些标签时遇到了问题。我已经知道如何在讨论部分显示最受欢迎的标签:

"SELECT t.id, t.tag, COUNT(discussion_id) AS cnt
    FROM tags_xref AS xrf
    INNER JOIN tags AS t ON xrf.tag_id = t.id
    GROUP BY t.id, t.tag
    ORDER BY COUNT(discussion_id) DESC LIMIT 20"

现在我想在整个网站上显示最流行的标签,所以从讨论、故事和文章中。有没有人可以帮助我解决这个问题?我已经为此工作了几个小时,但似乎找不到解决方案。谢谢!

【问题讨论】:

  • 能否请您在此处提供所有创建表查询以及示例数据?

标签: mysql sql


【解决方案1】:

您可以对查询进行简单修改:

SELECT t.id, t.tag, COUNT(*) AS cnt
FROM tags_xref xrf INNER JOIN
     tags t
     ON xrf.tag_id = t.id
GROUP BY t.id, t.tag
ORDER BY COUNT(*) DESC
LIMIT 20;

想必各种id不合适的时候都是NULL。如果出于某种奇怪的原因,您实际上将值存储在给定外部参照的所有三个 id 中,您可以这样做:

SELECT t.id, t.tag,
       (COUNT(story_id) + COUNT(discussion_id) + COUNT(article_id) ) AS cnt
FROM tags_xref xrf INNER JOIN
     tags t
     ON xrf.tag_id = t.id
GROUP BY t.id, t.tag
ORDER BY cnt DESC
LIMIT 20;

【讨论】:

  • 你是我的英雄,这很好用!确实,不合适的 id 通常为 NULL,但我会建立在安全的基础上。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 2013-12-10
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
相关资源
最近更新 更多