在网站上搜索了几个小时后,我找不到问题的正确答案,或者答案太复杂了。
我有一些来自 minecraft 服务器的统计数据,我想知道哪些方 block 是由谁创建的最多。所以我从 GROUP BY
和 MAX
开始,但它没有返回正确的值。 MAX
值是好的,但它与itemid
和playerid
冲突。它只选择第一个 id 和 playername。 (注意:每个 playerid 的每个项目都有一个单独的行!!!)查询如下:
SELECT `playername` , `itemid` , MAX( destroyed )
FROM `blockstats_typed`
GROUP BY `itemid`
LIMIT 0 , 30
那里的字段是playername
、itemid
、created
和destroyed
。我希望你们能帮助我...
如果您需要更多信息,请尽管说!
编辑 1(表架构):
id int(10) id of the row (AI)
playername varchar(50) playername
itemid smallint(5) id of the item
created int(10) times created
destroyed int(10) times destroyed
最佳答案
只有 MySQL 和 PostgreSQL(但 PostgreSQL 以更有限的方式做到这一点;并且一条评论告诉我 SQLite 在这方面模仿 MySQL)允许您从 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 次,您将取回两名玩家的名字(当然,如果该 ItemID 在前 30 名中)。
两者都是有效的查询;但是,他们做不同的事情。您必须决定哪一个(如果有的话)对于您要尝试做的事情是正确的。如果两者都不正确,您可能需要澄清您的问题。
(我不确定在我写的地方是否允许使用 LIMIT。如果不允许,请将其放在末尾。并且您可能希望添加一个带有 DESC 限定符的 ORDER BY 子句以确保限制子句显示最有趣的行;GROUP BY 不保证排序。)
关于mysql - MAX 和 GROUP BY 不返回好的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10457813/