我正在尝试从我的数据库中的所有视频中获取最受欢迎的标记(忽略空白标记)。我还需要每个标签的'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 | |
+-----------------+--------------+------+-----+---------+----------------+
答案 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)
然后很容易找到最受欢迎的标签。