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