MySQL COUNT()多列

时间:2010-04-12 20:29:43

标签: sql mysql count

我正在尝试从我的数据库中的所有视频中获取最受欢迎的标记(忽略空白标记)。我还需要每个标签的'flv'。如果每个视频都有一个标签,我可以按照我的意愿工作:

SELECT tag_1, flv, COUNT(tag_1) AS tagcount 
  FROM videos 
 WHERE NOT tag_1='' 
 GROUP BY tag_1 
 ORDER BY tagcount DESC LIMIT 0, 10

但是在我的数据库中,每个视频都允许使用三个标签 - tag_1,tag_2和tag_3。有没有办法让从多列中读取最受欢迎的标签?

记录结构是:

+-----------------+--------------+------+-----+---------+----------------+ 
| Field           | Type         | Null | Key | Default | Extra          | 
+-----------------+--------------+------+-----+---------+----------------+ 
| id              | int(11)      | NO   | PRI | NULL    | auto_increment | 
| flv             | varchar(150) | YES  |     | NULL    |                | 
| tag_1           | varchar(75)  | YES  |     | NULL    |                | 
| tag_2           | varchar(75)  | YES  |     | NULL    |                | 
| tag_3           | varchar(75)  | YES  |     | NULL    |                | 
+-----------------+--------------+------+-----+---------+----------------+ 

3 个答案:

答案 0 :(得分:6)

select tag, flv, count(*) as tag_count
from (
  select tag_1 as tag, flv from videos
  UNION
  select tag_2 as tag, flv from videos
  UNION
  select tag_3 as tag, flv from videos
) AS X

我认为会这样做,但如果任何记录对两个标签的值相同,则会重复计算。

更新:添加了AS X.

答案 1 :(得分:4)

您需要取消数据:

SELECT tag, COUNT(*)
FROM (
    SELECT tag_1 AS tag
    UNION ALL
    SELECT tag_2 AS tag
    UNION ALL
    SELECT tag_3 AS tag
) AS X (tag)
GROUP BY tag
ORDER BY COUNT(*) DESC

我不确定如何确定特定标签的flv,因为每个id可以有一个flv和最多3个标签,看起来任何标签都可以有许多不同的flv。

答案 2 :(得分:3)

这不是您问题的答案,但我相信这是解决您问题的最佳方案。

您是否可以更改架构?如果是这样,我认为最好通过将标签拉出到单独的表中来规范化。在这种情况下,最终可能会有2个或3个表,具体取决于标记是否为任意字符串或来自集/列表。在这个设置下,你有

Videos (VideoId, Flv)
Tags (TagId, TagName)
VideoTags(TagId, VideoId)

然后很容易找到最受欢迎的标签。