将MySQL select转换为PostgreSQL

将MySQL select转换为PostgreSQL,mysql,sql,postgresql,Mysql,Sql,Postgresql,我有一个在MySQL中正常工作的查询。更多的背景资料 我尝试在PostgreSQL中运行它,但失败了,出现了此错误消息 PGError:错误:“c.name”列必须 出现在GROUP BY子句中或be 用于聚合函数中 我不确定这意味着什么,所以我尝试在GROUPBY子句中将“c.id”更改为“c.name”(两者在MySQL中工作相同,假设一个项的名称是唯一的) 然而,这只是产生了另一个类似的错误 PGError:错误:“c.id”列必须 出现在GROUP BY子句中或be 用于聚合函数中 如何

我有一个在MySQL中正常工作的查询。更多的背景资料

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

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

我不确定这意味着什么,所以我尝试在GROUPBY子句中将“c.id”更改为“c.name”(两者在MySQL中工作相同,假设一个项的名称是唯一的)

然而,这只是产生了另一个类似的错误

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


如何解决这个问题?

我刚刚遇到了这个问题,但是从MySQL转到了SQL Server。我认为这是允许的,这很奇怪

是的,在大多数数据库中,如果有GROUPBY子句,则只能选择GROUPBY子句中出现的列或列的集合。这是因为它无法知道您选择的其他列是否真正唯一

如果列确实是唯一的,只需将它们放入组中即可。这是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, c.name, c.whatever_else
ORDER BY score DESC LIMIT 8;

如果您将您的声明更改为此,它应该可以工作:

SELECT c.id, 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;
我不确定MySQL会带来什么结果,但为了给您一个很小的例子说明为什么这在PostgreSQL中不起作用,请看下面的
类别
表:

id | name
---|-----
 1 | ABC
 1 | DEF
您按
id
进行分组,因此结果中的每一行应该只包含一个
id
。如果您也选择了
name
,而不按其分组,那么
name
的结果中应该显示什么


它可以是
ABC
DEF
,但数据库引擎无法真正为您决定这一点(尽管MySQL显然是这样做的)。

您必须在“选择”中列出要分组的列名:

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子句中未引用的列名。”

MySQL随机选择一个列名!这不是很奇怪吗?几天前我问了一个问题。有趣的是……在这种情况下,至少我的id是唯一的,所以这是一个很好的分组栏。我也需要类别的名称,所以我只在“选择”和“分组依据”中列出了它们。似乎有效。谢谢这在MySQL中是允许的,这就是为什么他感到困惑的原因。在我看来,MySQL链接有一个可怕的特性,现在它更有意义了!在这种情况下,我的c.id总是唯一的,所以可能没问题,但至少我现在知道他们为什么这么做了。谢谢奇怪的是,这似乎现在在Postgre9.1中被允许了。它在Postgre9.2中被删除了吗?我得到这个错误也是出于同样的原因。@Aaron:它没有被删除,但只有在(引用)未分组的列在功能上依赖于分组的列时才起作用,因为未分组的列可能返回多个值。如果分组列(或其子集)是包含未分组列的表的主键,则存在函数依赖关系
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;