MySQL : 不在 GROUP BY 中



站点生成结果,但是SELECT COUNT和GROUP BY的SELECT查询有两个不同的结果计数。这可能是由于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文档时,我仍然不清楚我必须修复什么。我似乎无法理解这一点。

您需要有一个完整的组通过:

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子句中的所有列(聚合除外)都是groupby子句的一部分。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

当然,这个问题的最佳解决方案是使用完整的GROUP BY表达式。

但是,还有另一种解决方案可以解决ONLY_FULL_GROUP_BYGROUP BY的旧MySQL扩展的阻塞问题。

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操作中曾经隐含的内容——服务器可以选择要返回的任何值。

上面多次提到的另一个解决方案是关闭令人讨厌的'ONLY_FULL_GROUP_BY',例如:禁用ONLY_FULL_GROUP_BY

如果您不想在多个小时内重构整个项目,我认为这个解决方案非常有用。如果您不关心不属于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() AS
MIN() AS
etc, works with strings, too

或者,如果真的都一样,例如,与分组值相关的非聚合值之间没有差异,则使用

ANY_VALUE() AS

无论哪种方式,您都可以让mysql知道您知道自己是"模棱两可的",但您真的不想把注意力集中在除了分组的列之外的所有列上。

只需禁用查询的严格性。

相关内容

  • 没有找到相关文章

最新更新