MAX 和 GROUP BY 不返回预期值

问题描述 投票:0回答:1

在网站上搜索了几个小时后,我找不到问题的正确答案,或者答案太复杂。 我有一些来自《我的世界》服务器的统计数据,我想知道哪些块由谁创建最多。所以我从

GROUP BY
MAX
开始,但它没有返回正确的值。
MAX
值很好,但与
itemid
playerid
冲突。它只选择第一个 id 和玩家名。 (注意:每个玩家 ID 的每个项目都有一个单独的行!!!)查询如下:

SELECT  `playername` ,  `itemid` , MAX( destroyed ) 
FROM  `blockstats_typed` 
GROUP BY  `itemid` 
LIMIT 0 , 30

那里的字段有

playername
itemid
created
destroyed
。我希望你们能帮助我...

如果您需要更多信息,请直接说!

编辑1(表架构):

专栏 类型 描述
id int(10) 行的id(AI)
玩家姓名 varchar(50) 玩家姓名
项目中 小整数(5) 商品的id
已创建 int(10) 创建次数
被摧毁 int(10) 多次被毁
mysql group-by max
1个回答
2
投票

只有 MySQL 和 PostgreSQL(但 PostgreSQL 以更有限的方式做到这一点;一条注释告诉我 SQLite 在这方面模仿了 MySQL)允许您省略 select- 中 GROUP BY 子句中的列(表达式)列出但不是聚合。如果您想要项目 ID、其被销毁的最大次数以及执行此操作的用户 ID(或多个 ID),则必须编写更复杂的查询。

所以,您可能会追求:

SELECT playername, itemid, MAX(destroyed) FROM blockstats_typed GROUP BY playername, itemid LIMIT 0, 30

或者你可能会追求:

SELECT b.PlayerName, s.ItemID, s.MaxDestroyed FROM BlockStats_Typed AS b JOIN (SELECT ItemID, MAX(Destroyed) AS MaxDestroyed FROM BlockStats_Typed GROUP BY ItemID LIMIT 0, 30 ) AS s ON b.ItemID = s.ItemID AND b.Destroyed = s.MaxDestroyed;

请注意,如果某个物品被两名玩家摧毁(例如 237,000 次),您将取回两名玩家的姓名(当然,如果该物品 ID 位于前 30 名)。

两者都是有效的查询;不过,他们做的事情不同。您必须决定哪一个(如果有的话)对于您想要做的事情来说是正确的。如果两者都不正确,您可能需要澄清您的问题。

(我不确定我写的地方是否允许使用 LIMIT。如果不允许,请将其放在末尾。并且您可能需要添加带有 DESC 限定符的 ORDER BY 子句,以确保 limit 子句显示最有趣的行;GROUP BY 不保证排序。)

© www.soinside.com 2019 - 2024. All rights reserved.