我的表格orders
包含字段id
,customer_id
和amt
:
我想让customer_id
获得最大的amt和amt
的值。
我提出了查询:
SELECT customer_id, MAX(amt) FROM orders;
但此查询的结果包含customer_id
的错误值。
然后我构建了这样的查询:
SELECT customer_id, MAX(amt) AS maximum FROM orders GROUP BY customer_id ORDER BY maximum DESC LIMIT 1;
并得到了正确的结果。
但我不明白为什么我的第一个查询无法正常运作。 我做错了什么?
是否可以更改我的第二个查询,以更简单,更称职的方式向我提供必要的信息?
答案 0 :(得分:4)
MySQL
将允许您离开查询GROUP BY
,从而使整个表中的MAX(amt)
返回任意customer_id
。大多数其他RDBMS在使用聚合时需要GROUP BY
子句。
我认为您的第二个查询没有任何问题 - 还有其他方法可以做到,但您的工作正常。
答案 1 :(得分:4)
某些版本的SQL在您选择字段时会给您一个警告或错误,包含MAX
或SUM
等聚合运算符,而您选择的字段不会出现在{{1}中}。
您需要一个更复杂的查询来获取与max amt相对应的customer_id。不幸的是,SQL并不像你想象的那么幼稚。一旦这样做就是:
GROUP BY
尽管使用连接的解决方案可能更具性能。
要了解为什么您尝试做的事情没有意义,请将select customer_id from orders where amt = ( select max(amt) from orders);
替换为MAX
。从如何解释聚合运算符的立场来看,SUM
返回与实际行相对应的东西仅仅是巧合。例如,MAX
没有此属性。
答案 2 :(得分:1)
实际上,您的第一个查询可以看作是GROUP BY-ed成为一个大的单个组。 此外,MySQL可以自由选择来自同一组的不同源行的每个输出值。
http://dev.mysql.com/doc/refman/5.7/en/group-by-extensions.html
MySQL扩展了GROUP BY的使用,以便选择列表可以引用 未在GROUP BY子句中命名的非聚合列。 服务器可以自由选择每个组中的任何值,所以 除非它们相同,否则所选择的值是不确定的。 此外,不能从每个组中选择值 受添加ORDER BY子句的影响。对结果集进行排序 选择值后发生,ORDER BY不影响 服务器选择的每个组中的值。
答案 3 :(得分:1)
MAX()
的问题在于,只考虑指定的字段,它将选择该指定字段的最高值。在任何程度上,不考虑或优先考虑同一行中的其他值。 MySQL通常会返回GROUP
的第一行的任何值(在这种情况下,GROUP
由整个表组成,没有指定组),在聚合期间删除其他行的信息
要解决这个问题,你可以这样做:
SELECT customer_id, amt FROM orders ORDER BY amt DESC LIMIT 1
它应该返回customer_id
和最高amt
,同时保留两者之间的关系,因为没有进行任何聚合。