我有此查询在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: ERROR: column"c.name" must
appear in the GROUP BY clause or be
used in an aggregate function
我不知道这是什么意思,所以我尝试在group by子句中将" c.id"更改为" c.name"(在MySQL中两者都是相同的,假定项的名称是唯一的)。
但是,这又产生了另一个类似的错误
PGError: ERROR: column"c.id" must
appear in the GROUP BY clause or be
used in an aggregate function
该问题如何解决?
奇怪的是,Postgre 9.1现在似乎允许这样做
它在Postgre 9.2中被删除了吗? 出于相同的原因,我收到此错误。
@Aaron:它没有被删除,但是仅在(引用文档)时才起作用:ungrouped列在功能上取决于grouped列,因为否则,对于ungrouped列,可能有多个可能的值返回。 如果分组的列(或其子集)是包含未分组的列的表的主键,则存在功能依赖性
您必须在要分组的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子句中未引用的列名。"
它在MySQL中是允许的,这就是为什么他感到困惑。 我认为这很可怕
我只是遇到了这个问题,但是从MySQL转到SQL Server。我认为允许的事实很奇怪!
是的,在大多数数据库中,当您具有GROUP BY子句时,您只能选择显示在GROUP BY子句中的一个或多个列的集合。这是因为它无法知道您选择的其他列是否真正唯一。
如果确实需要,只需将所需的列放在GROUP BY中即可。这是MySQL的"功能",值得商question。
您可以在此处阅读有关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;
感谢MySQL链接,现在更有意义了! 在这种情况下,我的c.id始终是唯一的,因此可能还可以,但是至少我现在知道他们为什么这样做了。 谢谢!
如果将您的声明更改为此,它应该起作用:
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中不起作用,请看下面的categories表:
id | name
---|-----
1 | ABC
1 | DEF
您按id分组,因此结果中的每一行应仅包含一个id。如果还选择name,但未按其分组,则name的结果应显示什么?
它可以是ABC或DEF,但是数据库引擎无法真正为您决定(尽管MySQL显然可以做到)。
MySQL随机选择一个! 奇怪吗? 几天前我问了一个问题。
有趣的是……在这种情况下,至少我的ID始终是唯一的,因此这是一个很好的分组依据。 我也需要类别的名称,因此我只在选择和分组依据中列出了。 似乎可以工作。 谢谢!