PostgreSQL - GROUP BY 子句

2024-03-30

我想按标签搜索,然后列出带有该标签的所有文章,以及它们匹配的给定标签的数量。例如我可能有:

 Page1 - 2 (has css and php tag)
 Page2 - 1 (has only css tag)

Query:

SELECT COUNT(t.tag)
FROM a_tags t
JOIN w_articles2tag a2t ON a2t.tag = t.id 
JOIN w_article a ON a.id = a2t.article 
WHERE t.tag = 'css' OR t.tag = 'php'
GROUP BY t.tag
LIMIT 9

当我只放COUNT(t.tag)查询有效,并且我得到了好的结果。但如果我附加例如ID我的文章出现以下错误:

错误:列“a.title”必须出现在 GROUP BY 子句中或在聚合函数中使用 第 1 行:从 a_tags t 中选择 COUNT(t.tag), a.title

如何将所述列添加到此查询中?


Postgres 9.1 或更高版本,引用 9.1 的发行说明 https://www.postgresql.org/docs/9.1/release-9-1.html#AEN110817 ...

允许非GROUP BY主查询时查询目标列表中的列 键指定在GROUP BY条款(彼得·艾森特劳特)

SQL 标准允许这种行为,并且由于主键, 结果是明确的。

Related:

  • 使用 Rails 和 PostgreSQL 返回包含出现次数的分组列表 https://stackoverflow.com/questions/11836874/return-a-grouped-list-with-occurrences-using-rails-and-postgresql/11847961#11847961

问题中的疑问和@迈克尔的回答 https://stackoverflow.com/a/18991690/939860逻辑倒退。我们想要计算有多少个标签匹配每篇文章,而不是有多少文章有某个标签。所以我们需要GROUP BY w_article.id,不是由a_tags.id.

列出带有该标签的所有文章,以及它们匹配的给定标签的数量

To fix this:

SELECT count(t.tag) AS ct, a.*  -- any column from table a allowed ...
FROM   a_tags         t
JOIN   w_articles2tag a2t ON a2t.tag = t.id
JOIN   w_article      a   ON a.id = a2t.article
WHERE  t.tag IN ('css', 'php')
GROUP  BY a.id                  -- ... since PK is in GROUP BY
LIMIT  9;

假设id是主键w_article.
然而,该表格将faster同时做同样的事情:

SELECT a.*, ct
FROM  (
   SELECT a2t.article AS id, count(*) AS ct
   FROM   a_tags         t
   JOIN   w_articles2tag a2t ON a2t.tag = t.id 
   GROUP  BY 1
   LIMIT  9      -- LIMIT early - cheaper
   ) sub
JOIN   w_article a USING (id);  -- attached alias to article in the sub

昨天的密切相关答案:

  • 为什么以下连接会显着增加查询时间? https://stackoverflow.com/questions/18970357/why-does-the-following-join-increase-the-query-time-significantly/18971600#18971600
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PostgreSQL - GROUP BY 子句 的相关文章

随机推荐