3

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

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

存在的字段是playernameitemid和。我希望你们能帮助我...createddestroyed

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

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

1 回答 1

2

只有 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 子句,以确保 limit 子句显示最多有趣的行;GROUP BY 不保证排序。)

于 2012-05-05T00:59:52.517 回答