繁体   English   中英

在MYSQL查询中结合使用GROUP BY和Union

[英]Using GROUP BY together with union in MYSQL query

这是我关于SO的第一个问题。 因此,我有一个名为posts的MYSQL表,其以下各列:

帖子,tag1,tag2。

假设表中共有10行。 其中9个帖子仅在tag1中具有标签,第十个帖子在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与union的问题,只是没有找到答案,或者对答案的理解不足以知道何时看到答案。

我认为您的意思是这样的( sqlfiddle ):

SELECT COUNT(*), tag
FROM
(
    SELECT Tag1 AS tag
    FROM posts
    UNION ALL
    SELECT Tag2 AS tag
    FROM posts
) AS alltags
GROUP BY tag

尝试:

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会执行隐式

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM