【问题标题】:Mysql invalid use of group function with Count?Mysql无效使用带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'

【问题讨论】:

  • 为什么坚持恢复格式编辑?

标签: mysql


【解决方案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 顺序
猜你喜欢
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 2021-11-21
  • 2018-05-14
  • 1970-01-01
相关资源
最近更新 更多