27

该站点产生结果,但使用 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 文档时,我仍然不清楚我必须修复什么。我似乎无法理解这一点。

4

5 回答 5

44

你需要有一个完整的组:

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
于 2014-09-12T04:20:17.870 回答
14

这个问题的最佳解决方案当然是使用完整的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——服务器可以选择任何值来返回。

于 2016-12-21T14:52:37.420 回答
1

上面多次提到的另一个解决方案是关闭烦人的“ONLY_FULL_GROUP_BY”,例如在这篇文章中: 禁用 ONLY_FULL_GROUP_BY

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

于 2017-10-23T05:08:11.487 回答
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 知道您意识到“模棱两可”,但您真的不想专注于除您分组的列之外的所有列。

于 2018-08-31T21:18:44.173 回答
-2

只需禁用查询的严格性。

于 2017-11-11T00:32:03.113 回答