该站点产生结果,但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文档时,我仍然不清楚我必须解决的问题。我似乎无法理解这一点。
答案 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)
只需禁用查询的严格性。