猿问

MySQL:不在GROUP BY中

该站点产生结果,但是使用SELECT COUNT和SELECT查询以及GROUP BY具有两个不同的结果计数。这可能是由于phpmyadmin中显示的错误,而不是网站上的错误。

查询:

SELECT count(DISTINCT `name`) as `numrows` FROM `users` WHERE `verified` = '1'SELECT `name`, `type`, `language`, `code` FROM `users` WHERE `verified` = '1' GROUP BY `name` ORDER BY `count` DESC LIMIT 0, 25

PhpMyAdmin提供以下错误:

1055-'main.users.type'不在GROUP BY中

在阅读MySQL文档时,我仍不清楚必须解决的问题。我似乎无法掌握这一点。


白猪掌柜的
浏览 831回答 3
3回答

智慧大石

您需要有一个完整的小组:SELECT `name`, `type`, `language`, `code` FROM `users` WHERE `verified` = '1' GROUP BY `name`, `type`, `language`, `code` ORDER BY `count` DESC LIMIT 0, 25SQL92要求select子句中的所有列(聚合除外)都是group by子句的一部分。SQL99稍微放松了此限制,并指出select子句中的所有列在功能上必须依赖于group by子句。MySQL默认情况下允许部分分组依据,这可能会产生不确定的答案,例如:create table t (x int, y int);insert into t (x,y) values (1,1),(1,2),(1,3);select x,y from t group by x;+------+------+| x    | y    |+------+------+|    1 |    1 |+------+------+即,为组x选择了随机y。可以通过设置@@ sql_mode来防止此行为:set @@sql_mode='ONLY_FULL_GROUP_BY';select x,y from t group by x; ERROR 1055 (42000): 'test.t.y' isn't in GROUP BY

qq_遁去的一_1

当然,最好的解决方案是使用完整的GROUP BY表达式。但是还有另一种解决方案,可以解决ONLY_FULL_GROUP_BY对的旧MySQL扩展的阻塞GROUP BY。SELECT name,         ANY_VALUE(type) type,        ANY_VALUE(language) language,        ANY_VALUE(code) code    FROM users    WHERE verified = '1'   GROUP BY name   ORDER BY count DESC LIMIT 0, 25ANY_VALUE()显式声明MySQL不完整GROUP BY操作中曾经隐含的内容-服务器可以选择任意值返回。

沧海一幻觉

首先是要了解为什么会这样。较早的版本使我们有些疏忽:虽然结果中完全列出了分组列的值(每个列均无例外),但其他选定列的值或多或少被省略了-但是代码可以不会(不想)代表您告诉哪些人:- Hey, MYSQL, list the families of the street - but add a first name as well to every row.- Okay sir, but shall I use the father's or the mother's or...? I'm a machine, give exact orders!现在我们了解了原因,我们可以决定是否对其他列有偏好。采用MAX() ASMIN() ASetc, works with strings, too或者,如果确实是一样的话,例如与分组值相关的非聚合值之间没有区别,请使用ANY_VALUE() AS无论哪种方式,您都让mysql知道您知道自己是“模棱两可的”,但您实际上不想将重点放在除您分组的列之外的所有列上。
随时随地看视频慕课网APP
我要回答