我正在尝试从我的数据库中的所有视频中获取最受欢迎的标签(忽略空白标签)。我还需要每个标签的'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 | |
+-----------------+--------------+------+-----+---------+----------------+ 发布于 2010-04-13 04:37:12
您需要取消透视数据:
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。
发布于 2010-04-13 04:36:54
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我认为这可以做到这一点,尽管如果任何记录中的两个标记具有相同的值,则会进行重复计数。
更新:添加为X。
发布于 2010-04-13 04:39:18
这不完全是对你问题的回答,但我相信这是你问题的最佳解决方案。
你有可能改变你的模式吗?如果是这样的话,我认为最好通过将标签拉出到一个单独的表中来标准化它。在这种情况下,您可能会得到2个或3个表,这取决于标签可以是任意字符串还是来自集合/列表。在这种设置下,你会有
Videos (VideoId, Flv)
Tags (TagId, TagName)
VideoTags(TagId, VideoId)这样就很容易找到最受欢迎的标签了。
https://stackoverflow.com/questions/2625212
复制相似问题