一尘不染

将MySQL select转换为PostgreSQL

mysql

我有此查询在MySQL中正常工作。这里有更多背景信息

SELECT c.*, SUM(ABS(v.vote)) AS score
FROM categories c,items i, votes v
    WHERE c.id = i.category_id
    AND i.id = v.voteable_id
    AND v.created_at > '#{1.week.ago}'
GROUP BY c.id
ORDER BY score DESC LIMIT 8;

我尝试在PostgreSQL中运行它,但此错误消息失败。

PGError:错误:列“ c.name”必须出现在GROUP BY子句中或在聚合函数中使用

我不确定这是什么意思,所以我尝试在group by子句中将“ c.id”更改为“ c.name”(在MySQL中两者都是相同的,假定项的名称是唯一的)。

但是,这又产生了另一个类似的错误

PGError:错误:列“ c.id”必须出现在GROUP BY子句中或在聚合函数中使用

该问题如何解决?


阅读 428

收藏
2020-05-17

共1个答案

一尘不染

您必须在要分组的SELECT中列出列名:

SELECT c.id, c.name, SUM(ABS(v.vote)) AS score
FROM categories c,items i, votes v
  WHERE c.id = i.category_id
  AND i.id = v.voteable_id
  AND v.created_at > '#{1.week.ago}'
GROUP BY c.id, c.name
ORDER BY score DESC LIMIT 8;

“不允许在SELECT子句中包括GROUP BY子句中未引用的列名。”

2020-05-17