mysql - MAX 和 GROUP BY 不返回好的值

标签 mysql group-by max

在网站上搜索了几个小时后,我找不到问题的正确答案,或者答案太复杂了。 我有一些来自 minecraft 服务器的统计数据,我想知道哪些方 block 是由谁创建的最多。所以我从 GROUP BYMAX 开始,但它没有返回正确的值。 MAX 值是好的,但它与itemidplayerid 冲突。它只选择第一个 id 和 playername。 (注意:每个 playerid 的每个项目都有一个单独的行!!!)查询如下:

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

那里的字段是playernameitemidcreateddestroyed。我希望你们能帮助我...

如果您需要更多信息,请尽管说!

编辑 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/

相关文章:

php - 无法从 CSV 文件导入特殊字符

mysql - 帮助选择不同

MySql 用户基于 DATE 的预约次数

apache-spark - PySpark:根据其他三列的最大值查找一列的值

javascript - 如何将 mysql 查询的结果放入 html 文本框中

php - 我的时间戳有什么问题吗?

SQL - AVG 和分组依据

c# - 让 Entity Framework 在 Group By 上急切加载

iphone - 如何在没有声音指示器变化的情况下在 iOS 中以最大音量播放声音文件

javascript - 数组中日期的最小值/最大值?