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
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
操作中曾经隐含的内容-服务器可以选择任意值返回。
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知道您知道自己是“模棱两可的”,但您实际上不想将重点放在除您分组的列之外的所有列上。
添加回答
举报