【问题标题】:Counting the most tagged tag with MySQL用 MySQL 计算标签最多的标签
【发布时间】:2011-02-04 00:57:17
【问题描述】:

我的问题是我试图在用户提交的代码表中计算哪个标签被使用得最多。但问题在于数据库结构。

我正在使用的当前查询是这样的:

SELECT tag1, COUNT(tag1) AS counttag 
FROM code 
GROUP BY tag1 
ORDER BY counttag DESC LIMIT 1

这很好,除了它只计算最常出现的 tag1 - 我的数据库每个帖子有 5 个标签 - 所以有 tag1、tag2、tag3、tag4、tag5 列。如何从一个查询中的所有 5 列中获取最高出现的标记值?

杰克

【问题讨论】:

  • 感谢 Davek 的编辑! :)

标签: php codeigniter mysql tags


【解决方案1】:

你应该做 2-3 张桌子。我通常做3个:

代码

  • 身份证
  • 代码

code_tags:

  • code_id
  • tag_id

标签:

  • 身份证
  • 姓名

查询显示使用的标签数量:

   SELECT t.*, COUNT(tag_id) as code_count 
     FROM code_tags ct 
LEFT JOIN tags t ON ct.tag_id = t.id 
 GROUP BY tag_id 
 ORDER BY code_count DESC 
    LIMIT 1

【讨论】:

  • +1:用于正确建模和查询。格式化您的答案以便更容易阅读将带来好处 - 请参阅降价参考:stackoverflow.com/editing-help
  • 并将count字段添加到tags表中用于存储每个标签计数的预先计算值也是可以接受的。
【解决方案2】:
Select tag, Count(tag) AS counttag 
From (
    Select tag1 As tag
    From code
    Union All
    Select tag2 As tag
    From code
    Union All
    Select tag3 As tag
    From code
    ...
) t
Group BY tag
Order BY counttag Desc Limit 1

更好的方法是规范化您的表格(另见mark_dj's answer):

code_tag(包含代码的所有标签):

Code_id
Tag

【讨论】:

    【解决方案3】:

    嗯,你说得对,你的数据库结构是问题所在。

    可以创建一个 SQL 查询,其中包含子查询,每个子查询都通过同一个表并提取有关每个标签字段的信息。但是,我建议两种选择:

    1. 只需进行 5 个不同的查询。除非您特别在一个 SQL 查询中需要此信息(这似乎不太可能),否则只需向数据库发出 5 个请求,然后以编程方式组织信息会更简单

    2. 修复您的数据库结构以使用连接表。我大胆猜测,这只是由于这种数据库结构而您将遇到的许多问题中的第一个。

    通过连接表,您可以查看 2 个额外的表:

    CREATE TABLE code_tags {
      code_id INT,
      tag_id INT
    }
    
    CREATE TABLE tags {
      id INT,
      other fields
    }
    

    您可以使用连接表添加标签,而不是在 code 表中使用 tagX 字段

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 1970-01-01
      • 2020-11-26
      • 2021-09-22
      • 1970-01-01
      相关资源
      最近更新 更多