Mysql无效使用带Count的组函数?

Posted

技术标签:

【中文标题】Mysql无效使用带Count的组函数?【英文标题】:Mysql invalid use of group function with Count? 【发布时间】:2014-03-29 00:27:02 【问题描述】:

我正在构建一个游戏,我目前正在研究匹配玩家机制,但我遇到了这个我无法理解的错误。我有 2 个表 games 保存有关游戏不同实例的信息,players 保存每个游戏中的玩家。现在,当新玩家加入匹配队列时,我想选择所有当前尚未开始的游戏并将它们(玩家)添加到相应的游戏中。我如何识别未开始的游戏是根据其中的玩家数量。如果一个游戏是为 2 名玩家设计的,那么任何有 1 名玩家的游戏都还没有开始。这是我的查询

SELECT * // * for saving time in testing
FROM games d LEFT JOIN players dp ON d.id = dp.gameId 
WHERE d.players > COUNT(dp.playerId) LIMIT 1

但我得到了这个烦人的错误

1111 - 组函数使用无效

我试过这样

SELECT *, COUNT(dp.playerId) AS cPlayers 
FROM games d LEFT JOIN players dp ON d.id = dp.gameId 
WHERE d.players > cPlayers LIMIT 1

然后我明白了

1054 - 'where 子句'中的未知列 'cPlayers'

【问题讨论】:

为什么坚持恢复格式编辑? 【参考方案1】:

我想这应该可行。

SELECT * 
FROM games d LEFT JOIN players dp ON d.id = dp.gameId
GROUP BY d.id
HAVING d.players > COUNT(dp.playerId) LIMIT 1

【讨论】:

GROUP BY 应该在d.id上执行 @zerkms 好点。消除了我对它为什么不使用我的索引的疑虑! @zerkms 谢谢,没注意,更新了答案【参考方案2】:

您应该在字段上使用 GROUP BY 以使用 COUNT(dp.playerId) 等聚合函数。

试试这个

SELECT COUNT(dp.playerId) AS cPlayers 
FROM games d LEFT JOIN players dp ON d.id = dp.gameId group by dp.playerId  
WHERE d.players > cPlayers LIMIT 1

【讨论】:

GROUP BY go after WHERE PS:由于在 where 中使用了cPlayers,它不会运行 如果条件放在HAVING子句中会起作用吗?喜欢:拥有 d.players > cPlayers 那么它会起作用,但你仍然有错误的group by & where 顺序

以上是关于Mysql无效使用带Count的组函数?的主要内容,如果未能解决你的问题,请参考以下文章

零基础带你学习MySQL—统计函数(合计函数)

mysql 带条件的sum/count 使用技巧

mysql 带条件的sum/count 使用技巧

MySQL,混淆 w/查询/错误代码:1111。组函数的使用无效。

MySQL利用count()函数统计总数的技巧

MySQL最常用分组聚合函数