为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL:不在GROUP BY中

MySQL:不在GROUP BY中

白猪掌柜的 2019-09-26 11:10:37
该站点产生结果,但是使用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, 25PhpMyAdmin提供以下错误:1055-'main.users.type'不在GROUP BY中在阅读MySQL文档时,我仍不清楚必须解决的问题。我似乎无法掌握这一点。
查看完整描述

3 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞


您需要有一个完整的小组:


SELECT `name`, `type`, `language`, `code` 

FROM `users` 

WHERE `verified` = '1' 

GROUP BY `name`, `type`, `language`, `code` 

ORDER BY `count` DESC LIMIT 0, 25

SQL92要求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


查看完整回答
反对 回复 2019-09-26
?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

当然,最好的解决方案是使用完整的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, 25

ANY_VALUE()显式声明MySQL不完整GROUP BY操作中曾经隐含的内容-服务器可以选择任意值返回。


查看完整回答
反对 回复 2019-09-26
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

首先是要了解为什么会这样。较早的版本使我们有些疏忽:虽然结果中完全列出了分组列的值(每个列均无例外),但其他选定列的值或多或少被省略了-但是代码可以不会(不想)代表您告诉哪些人:

- 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知道您知道自己是“模棱两可的”,但您实际上不想将重点放在除您分组的列之外的所有列上。


查看完整回答
反对 回复 2019-09-26
  • 3 回答
  • 0 关注
  • 830 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信