我的问题是我正在尝试计算用户提交的代码表中最常使用的标记。但问题在于数据库结构。
我正在使用的当前查询是:
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列中获取最高出现的标记值?
杰克
答案 0 :(得分:9)
你应该制作2-3张桌子。我通常会做3:
进行显示所用标签数量的查询:
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查询,其中包含子查询,每个子查询通过同一个表并提取有关每个标记字段的信息。但是,我建议两种选择:
只需提出5个不同的查询。除非你具体在一个SQL查询中需要这些信息(这似乎不太可能),否则向数据库发出5个请求然后以编程方式组织信息会更加简单
修复您的数据库结构以使用连接表。我猜测这只是因为这个数据库结构而会遇到的任何问题中的第一个。
通过连接表,您可以查看2个额外的表:
CREATE TABLE code_tags {
code_id INT,
tag_id INT
}
CREATE TABLE tags {
id INT,
other fields
}
您可以使用连接表添加标记,而不是在tagX
表中包含code
个字段