尝试分组时查询选择了错误的数据
Query selecting wrong data when trying to group
这个MySQL查询应该return今天得分低于270的TOP 15玩家。每个玩家都可以玩很多次,所以它应该return玩家最高分。我不明白 GROUP BY
或 SELECT
子句有什么问题。
SELECT userName,
MAX(CAST(Score AS UNSIGNED)) Score
FROM Game
WHERE userName IS NOT NULL AND
CAST(Score AS UNSIGNED) < 270 AND
DATE(PlayTime) = DATE(NOW())
GROUP BY FBId, userName, CAST(Score AS UNSIGNED)
ORDER BY CAST(Score AS UNSIGNED) DESC LIMIT 15
FBId
对每个玩家都是唯一的,这就是为什么我在 GROUP BY
子句中取消它,如果玩家有相同的名字,userName
可以相等。
P.s。分数是 VARCHAR
类型,这就是我将其转换为 INT
.
的原因
使用上面的查询后,它选择了以下重复名称:
Will Jason 227
Will Jason 226
Jessica Anton 219
Jessica Anton 218
Tom Edi 215
Simon Dougs 213
Peter Yang 210
Steeve Maclay 208
Monica Termson 207
Dave Stuart 206
那是因为包含了 Score
到 GROUP BY
子句?
但是如果我使用以下查询(从 GROUP BY
中删除了 CAST(Score AS UNSIGNED)
):
SELECT userName,
MAX(CAST(Score AS UNSIGNED)) Score
FROM Game
WHERE userName IS NOT NULL AND
CAST(Score AS UNSIGNED) < 270 AND
DATE(PlayTime) = DATE(NOW())
GROUP BY FBId, userName
ORDER BY CAST(Score AS UNSIGNED) DESC LIMIT 15
也选错了(跳过部分用户):
Will Jason 227
Jessica Anton 219
Jeniffer Taylor 195
Tom Drugton 187
Monica Termson 207
Christina Queenton 183
Dave Stuart 206
David Tomson 170
Susan Clark 205
Sarah Lopez 188
你有什么想法吗?似乎第一个查询选择了具有重复名称的正确值。
更新:
Table结构:
Id INT AUTO_INCREMENT
FBId INT
Score VARCHAR(20)
userName NVARCHAR(80)
PlayTime TIMESTAMP
select fbid, username, max(score) as thescore
from game
where score < 270
group by fbid
order by max(cast(score as unsigned)) desc limit 15;
这个MySQL查询应该return今天得分低于270的TOP 15玩家。每个玩家都可以玩很多次,所以它应该return玩家最高分。我不明白 GROUP BY
或 SELECT
子句有什么问题。
SELECT userName,
MAX(CAST(Score AS UNSIGNED)) Score
FROM Game
WHERE userName IS NOT NULL AND
CAST(Score AS UNSIGNED) < 270 AND
DATE(PlayTime) = DATE(NOW())
GROUP BY FBId, userName, CAST(Score AS UNSIGNED)
ORDER BY CAST(Score AS UNSIGNED) DESC LIMIT 15
FBId
对每个玩家都是唯一的,这就是为什么我在 GROUP BY
子句中取消它,如果玩家有相同的名字,userName
可以相等。
P.s。分数是 VARCHAR
类型,这就是我将其转换为 INT
.
使用上面的查询后,它选择了以下重复名称:
Will Jason 227
Will Jason 226
Jessica Anton 219
Jessica Anton 218
Tom Edi 215
Simon Dougs 213
Peter Yang 210
Steeve Maclay 208
Monica Termson 207
Dave Stuart 206
那是因为包含了 Score
到 GROUP BY
子句?
但是如果我使用以下查询(从 GROUP BY
中删除了 CAST(Score AS UNSIGNED)
):
SELECT userName,
MAX(CAST(Score AS UNSIGNED)) Score
FROM Game
WHERE userName IS NOT NULL AND
CAST(Score AS UNSIGNED) < 270 AND
DATE(PlayTime) = DATE(NOW())
GROUP BY FBId, userName
ORDER BY CAST(Score AS UNSIGNED) DESC LIMIT 15
也选错了(跳过部分用户):
Will Jason 227
Jessica Anton 219
Jeniffer Taylor 195
Tom Drugton 187
Monica Termson 207
Christina Queenton 183
Dave Stuart 206
David Tomson 170
Susan Clark 205
Sarah Lopez 188
你有什么想法吗?似乎第一个查询选择了具有重复名称的正确值。
更新:
Table结构:
Id INT AUTO_INCREMENT
FBId INT
Score VARCHAR(20)
userName NVARCHAR(80)
PlayTime TIMESTAMP
select fbid, username, max(score) as thescore
from game
where score < 270
group by fbid
order by max(cast(score as unsigned)) desc limit 15;