MySQL - > PostgreSQL SQL语句与GROUP冲突

时间:2017-05-20 17:17:09

标签: mysql sql postgresql

在MySQL中是SQL语句:

SELECT count(*) as total 
FROM ossn_entities as e 
JOIN ossn_entities_metadata as emd ON e.guid=emd.guid 
WHERE(e.subtype='gender' AND e.type='user' AND emd.value = 'male') 
ORDER by e.guid ASC ; 

给了我正确答案5。

我将此语句修改为PostgreSQL:

SELECT count(*) as total 
FROM ossn_entities as e 
JOIN ossn_entities_metadata as emd ON e.guid=emd.guid 
WHERE(e.subtype='gender' AND e.type='user' AND emd.value = 'male') 
GROUP BY e.guid 
ORDER by e.guid ASC ; 

现在就是答案:

1
1
1
1
1

这是不正确的。

由于PostgreSQL错误,我修改了这个MySQL:

ERROR:  column "e.guid" must appear in the GROUP BY clause or be used in an aggregate function

如何修改MySQL语句以获得正确的答案5而不是数组?

3 个答案:

答案 0 :(得分:1)

您只阅读错误消息的前半部分:

  

错误:列“e.guid”必须出现在GROUP BY子句...

当它实际上是你想要的下半场时:

  

...或用于聚合函数

当您输出的内容是这些项目的整个组的聚合(总和,计数等)时,按个别项目排序没有任何意义。如果组中有50个不同的值,它会排序的ORDER BY AVG(e.guid)值是多少?

MySQL具有猜测的可疑功能;几乎其他DBMS让你澄清。例如,您可以按最低(ORDER BY)或平均值(ORDER BY e.guid)排序。这就是“必须......用于聚合函数”。

但是,在您的示例中,您只返回一行,因此{{1}}无论如何都没有任何意义 - 您如何排序一件事?因此,如果您提供的示例实际上是真正的查询,那么答案就是完全删除{{1}},因为它从来没有做过任何事情。

答案 1 :(得分:1)

第一个查询不正确。 MySQL让它滑倒了,但它仍然是不正确的。您汇总(count(*))没有任何GROUP BY,因此您获得一个结果行。这一行由guid“排序”。由于您没有指定要为行选择的guid(例如找到的最大值或最小值),因此您可以随意选择一个。{1}}。但是,排序的一行只是一行;没有什么可以排序的。所以查询实际上是:

SELECT count(*) as total 
FROM ossn_entities as e 
JOIN ossn_entities_metadata as emd ON e.guid = emd.guid 
WHERE e.subtype = 'gender' AND e.type = 'user' AND emd.value = 'male';

在MySQL和PostgreSQL以及任何其他RDBMS中都有效。

答案 2 :(得分:0)

我试着简单地放弃

 GROUP BY e.guid ORDER by e.guid ASC

因为你想要一个单独的值,你不能用guid进行分组,更不用说它的排序了。 MySQL可能会试图忽略这种不一致。