微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么MySQL允许没有聚合功能的“分组”查询?

如何解决为什么MySQL允许没有聚合功能的“分组”查询?

我认为这是要处理按一个字段分组意味着其他字段也要分组的情况:

SELECT user.id, user.name, COUNT(post.*) AS posts 
FROM user 
  LEFT OUTER JOIN post ON post.owner_id=user.id 
GROUP BY user.id

在这种情况下,user.name对于每个user.id始终是唯一的,因此在GROUP BY子句中不需要user.name是很方便的(尽管正如您所说,存在一定的问题范围)

解决方法

惊喜-这是MySQL中完全有效的查询:

select X,Y from someTable group by X

如果您在Oracle或SQL Server中尝试了此查询,则会收到自然错误消息:

Column 'Y' is invalid in the select list because it is not contained in 
either an aggregate function or the GROUP BY clause.

那么MySQL如何确定每个X显示哪个Y?它只是选择一个。据我所知,它只是选择找到的第一个Y。理由是,如果Y既不是聚合函数也不在group
by子句中,则在查询中指定“选择Y”是没有道理的。因此,作为数据库引擎的我将返回我想要的任何东西,而您会喜欢它。

甚至还有一个MySQL配置参数来关闭这种“松散性”。 http://dev.mysql.com/doc/refman/5.7/zh-CN/sql-
mode.html#sqlmode_only_full_group_by

这篇文章甚至提到MySQL在这方面被批评为不符合ANSI-SQL。
http://www.oreillynet.com/databases/blog/2007/05/debunking_group_by_myths.html

我的问题是: 为什么 MySQL以这种方式设计?他们打破ANSI-SQL的理由是什么?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。