使用MySQL计算标记最多的标记

时间:2010-04-03 16:37:31

标签: php codeigniter mysql tags

我的问题是我正在尝试计算用户提交的代码表中最常使用的标记。但问题在于数据库结构。

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

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列中获取最高出现的标记值?

杰克

3 个答案:

答案 0 :(得分:9)

你应该制作2-3张桌子。我通常会做3:

  • ID

code_tags:

  • code_id
  • TAG_ID

标签:

  • 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 :(得分:1)

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

答案 2 :(得分:0)

嗯,你的数据库结构是正确的,这是正确的。

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

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

  2. 修复您的数据库结构以使用连接表。我猜测这只是因为这个数据库结构而会遇到的任何问题中的第一个。

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

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

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