Postgres 错误:必须出现在 GROUP BY 子句中或在聚合函数中使用

and*_*sen 1 postgresql postgresql-9.3

我是 Postgres 的新手,我意识到以前有人问过类似的问题,但是,我正在努力使这个查询工作:

SELECT    p_search.id, count(kia.image_id) AS count
FROM      (SELECT id,
                  keyword,
                  to_tsvector('english',keyword) AS tskw
          FROM keyword) AS p_search
LEFT JOIN keyword_image_assoc AS kia 
ON        kia.keyword_id = p_search.id
WHERE     p_search.tskw @@ plainto_tsquery('english','resident life')
OR        p_search.tskw @@ plainto_tsquery('english','wofford')
GROUP BY  kia.image_id
ORDER BY  count desc
Run Code Online (Sandbox Code Playgroud)

对于上下文,我有三个表:

  • image其中有一个id作为主键
  • keyword它具有id作为主键,keyword它是一个表示关键字的字符串
  • keyword_image_assoc其中有一个idimage_id并且keyword_id它是用来关联图像和关键字规范地。

如果我添加p_search.idGROUP BY子句中,结果不正确 -count总是 1。有没有办法对结果进行分组,以便image_ids 具有匹配关键字的数量?

我正在寻找两列count- 匹配关键字的数量和image_id相应图像的 id。谢谢!

McN*_*ets 5

查看有关GROUP BY 的Postgres 文档:

当存在GROUP BY或存在任何聚合函数时,SELECT列表表达式引用未分组的列是无效的,除非在聚合函数内或当未分组的列在功能上依赖于分组的列时,否则会有更多为未分组的列返回一个可能的值。如果分组列(或其子集)是包含未分组列的表的主键,则存在函数依赖性。

据此,如果字段未出现在 GROUP BY 子句中或未使用聚合函数,则您不能在 SELECT 语句中引用该字段。

在您的示例中,您正在引用p_search.id但它没有出现在 GROUP BY 子句中。你可以尝试改变它kia.image_id