站点生成结果,但是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_BY
对GROUP 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知道您知道自己是"模棱两可的",但您真的不想把注意力集中在除了分组的列之外的所有列上。
只需禁用查询的严格性。