1

这是我关于 SO 的第一个问题。所以我有一个名为 posts 的 MYSQL 表,其中包含以下列:

发布,标签1,标签2。

假设表中有 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 with union 的许多其他问题,只是没有找到答案,或者我对此理解不够,无法知道何时看到答案。

4

2 回答 2

4

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

SELECT COUNT(*), tag
FROM
(
    SELECT Tag1 AS tag
    FROM posts
    UNION ALL
    SELECT Tag2 AS tag
    FROM posts
) AS alltags
GROUP BY tag
于 2012-08-12T08:19:41.103 回答
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 执行隐式不同

于 2012-08-12T08:29:08.403 回答