[英]When using an aggregate function in SQL, will the associated columns be selected?
我有以下查询
SELECT
day,
category_id,
name,
qval
MIN(CONCAT(category_id, qval))
FROM facts
WHERE
day = CURDATE()
GROUP BY
category_id
选择的name
将始终是与所标识的MIN
记录相关联的name
吗?
绝对不。 没有理由期望情况会如此。 这是您的查询:
SELECT day, category_id, name, qval
MIN(CONCAT(category_id, qval))
FROM facts
WHERE day = CURDATE()
GROUP BY category_id;
尽管没有这样标识,但该语法是MySQL。 您使用的是MySQL扩展,因为select
中有一些列不是聚合函数的参数,也不在group by
。 这些值来自任意行。 以下是有关扩展名使用的一些相关文档 :
MySQL扩展了GROUP BY的使用,以便选择列表可以引用未在GROUP BY子句中命名的非聚合列。 这意味着前面的查询在MySQL中是合法的。 您可以使用此功能来避免不必要的列排序和分组,从而获得更好的性能。 但是,这主要在每个未聚合列中未在GROUP BY中命名的所有值对于每个组都相同时才有用。 服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的。
我相信此问题已在MySQL 5.7中解决,因为5.7检测到功能依赖性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.