这是我关于SO的第一个问题。所以我有一个名为posts的MYSQL表,其中包含以下列:
post,tag1,tag2。
假设表中总共有10行。其中9个帖子只有tag1中的标签,而第10个帖子在tag1和tag2中有标签(tag2中的标签在tag1中重复用于其他帖子。)下面是表格的样子:
Tag1 Tag2
computer -
tv -
computer -
tv -
laptop -
bicycle -
stereo -
computer laptop
tv -
laptop -
我想要的功能是查询表格以获得出现频率最高的标签,将它们组合在一起,然后按照从最高频率到最低频率的顺序对它们进行排序。这是我的mysql查询(我正在使用PDO):
SELECT count, tag
FROM (SELECT count(tag1) as count, tag1 as tag FROM posts) as a
UNION ALL
SELECT count(tag2) as count, tag2 as tag
FROM posts
此查询不起作用,因为它不会显示每个存在的标记,并且它似乎也没有将列tag2中的一个标记添加到tag1的结果中,而是存在重复。因此,我没有看到笔记本电脑出现3次,而是看到笔记本电脑出现两次然后出现一次。
我认为这将由GROUP BY解决,但是当我尝试添加GROUP BY时,mysql会抛出一个通用语法错误,说明我的数据库服务器的文档。所以我想我不知道在哪里放置GROUP BY,我可能认为我的查询根本就不正确。请给我任何帮助....我已经看过很多关于使用group by with union的其他问题,但是我没有找到答案,或者我不明白这一点,知道什么时候能看到答案。
答案 0 :(得分:3)
我认为你的意思是这样的(sqlfiddle):
SELECT COUNT(*), tag
FROM
(
SELECT Tag1 AS tag
FROM posts
UNION ALL
SELECT Tag2 AS tag
FROM posts
) AS alltags
GROUP BY tag
答案 1 :(得分:1)
尝试:
SELECT tag, count(*) AS frequency
FROM
(
SELECT tag1 AS tag FROM posts
UNION ALL SELECT tag2 AS tag FROM posts
) AS alltags
WHERE tag IS NOT NULL
GROUP BY tag
ORDER BY frequency DESC
请注意,您需要UNION ALL,因为UNION执行隐式的不同