2012-08-12 93 views
0

这是我在SO上的第一个问题。所以我有一个名为posts的MYSQL表格,其列如下:在MYSQL查询中使用GROUP BY和union

post,tag1,tag2。

假设表中有10个总计行。该帖子9在只有标签1标签,以及第十具有TAG1和TAG2(在标签2的标签被复制在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放在哪里,我可能会认为我的查询根本就不正确。任何可用的帮助,请.... ive看了许多其他问题关于使用组与工会,只是没有找到答案或我不明白这足以知道我什么时候看到答案。

+0

什么是您查询用GROUP BY抛出语法错误? – 2012-08-12 08:19:38

+0

我基本上只是修改上面的查询,在第一个FROM之后有另一个开放的parens,然后是第二个post之后的另一个开始parens,然后添加GROUP BY标记。这没有用,下面的答案让我想要成为我。只是不知道该说什么才是正确的答案,因为他们每个人都帮我弄清楚了。 – Cbomb 2012-08-12 09:35:39

回答

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 
+0

太棒了。谢谢。这样可行。 – Cbomb 2012-08-12 08:43:26

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执行隐不同

+0

谢谢你。能够将你在ORDER BY部分做的事情与上面的答案结合起来。似乎现在工作得很好。 – Cbomb 2012-08-12 08:44:28