3

Web サイトで数時間検索した後、問題に対する正しい答えが見つからなかったか、答えが複雑すぎました。Minecraft サーバーからの統計があり、どのブロックが誰によって最も多く作成されているかを知りたいです。だから私はGROUP BYandから始めましMAXたが、正しい値を返しませんでした。値は適切ですが、および とMAX競合します。最初の ID とプレイヤー名を選択するだけです。(注: 各プレーヤー ID には、アイテムごとに個別の行があります!!!) クエリは次のとおりです。itemidplayerid

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

そこにあるフィールドは、、、playernameおよびです。皆さんが私を助けてくれることを願っています...itemidcreateddestroyed

さらに情報が必要な場合は、そう言ってください。

編集 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 を模倣しているとのことです) では、select-list にあるが、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;

アイテムが 2 人のプレイヤーによって 237,000 回破壊された場合、両方のプレイヤーの名前が返されることに注意してください (もちろん、その ItemID が上位 30 に含まれている場合)。

どちらも有効なクエリです。しかし、彼らは異なることをします。やろうとしていることに対してどちらが正しいかを判断する必要があります。どちらも正しくない場合は、おそらく質問を明確にする必要があります。

(私が書いた場所で LIMIT が許可されているかどうかはわかりません。許可されていない場合は、最後に配置してください。また、LIMIT 句が最大限に表示されるように、DESC 修飾子を含む ORDER BY 句を追加することをお勧めします。興味深い行; GROUP BY はソートを保証しません。)

于 2012-05-05T00:59:52.517 に答える