在MYSQL查询中使用GROUP BY和union

时间:2012-08-12 08:13:04

标签: mysql group-by union

这是我关于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的其他问题,但是我没有找到答案,或者我不明白这一点,知道什么时候能看到答案。

2 个答案:

答案 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执行隐式的不同