在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而不是数组?
答案 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可能会试图忽略这种不一致。