MySQL:不在GROUP BY中

时间:2014-09-12 03:47:36

标签: mysql sql phpmyadmin mysql-error-1055

该站点产生结果,但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文档时,我仍然不清楚我必须解决的问题。我似乎无法理解这一点。

5 个答案:

答案 0 :(得分:31)

你需要一个完整的小组:

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 |
+------+------+

即。随机y选择组x。可以通过设置@@ 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

答案 1 :(得分:9)

此问题的最佳解决方案当然是使用完整的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操作中隐含的内容 - 服务器可以选择返回的任何值。

答案 2 :(得分:0)

上面多次提到的另一个解决方案是关闭恼人的 ' ONLY_FULL_GROUP_BY' ,例如喜欢这篇文章: Disable ONLY_FULL_GROUP_BY

如果您不想在多个小时内重构整个项目,我认为此解决方案非常有用。如果您不关心不是 GROUP BY 列表的列的不可预测值。

答案 3 :(得分:0)

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

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

答案 4 :(得分:-1)

只需禁用查询的严格性。

相关问题