0

ランキンググリッドをやりたいです。

キーでインデックス付けされたさまざまな値を持つテーブルがあります。

テーブルSimpleValue:key varchar、value int、playerId int

SimpleValueがいくつかあるプレーヤーがいます。

テーブルプレーヤー:id int、ニックネームvarchar

次に、これらのレコードを想像してください。

SimpleValue:

Key      value     playerId
for      1         1
int      2         1
agi      2         1
lvl      5         1

for      6         2
int      3         2
agi      1         2
lvl      4         2

プレーヤー:

id     nickname
1      Bob
2      John

これらのプレーヤーのランクをさまざまなSimpleValueに表示したいと思います。何かのようなもの:

nickname      for       lvl     
Bob           1         5       
John          6         4  

今のところ、表示するSimpleValueキーと、プレーヤーを注文するSimpleValueキーに基づいてSQLクエリを生成します。

例:各プレーヤーの「lvl」と「for」を表示し、「lvl」で注文したい

生成されるクエリは次のとおりです。

SELECT p.nickname as nickname, v1.value as lvl, v2.value as for
FROM Player p
LEFT OUTER JOIN SimpleValue v1 ON p.id=v1.playerId and v1.key = 'lvl'
LEFT OUTER JOIN SimpleValue v2 ON p.id=v2.playerId and v2.key = 'for'
ORDER BY v1.value

このクエリは完全に実行されます。しかし、10個の異なる値を表示したい場合は、10個の「左外部結合」が生成されます。このクエリを単純化する方法はありますか?

2番目の質問があります:このランキングの一部を表示する方法はありますか?1000人のプレーヤーがいて、TOP 10を表示したい場合、LIMITキーワードを使用するとします。ここで、プレーヤーBobのランク(326/1000)を表示し、上下に5ランクのプレーヤー(つまり、321から331の位置)を表示します。どうすればそれを達成できますか?

ありがとう。

4

1 に答える 1

2

これは「クロスタブクエリ」と呼ばれます。このページのような条件付き合計ステートメントを使用できます

取得するため:

SELECT p.nickname as nickname
, SUM(IF(key = "for", value,0)) AS `for`
, SUM(IF(key = "int", value,0)) AS `int`
, SUM(IF(key = "agi", value,0)) AS `agi`
, SUM(IF(key = "lvl", value,0)) AS `lvl`
FROM Player p
LEFT OUTER JOIN SimpleValue v1 ON p.id=v1.playerId
GROUP By p.nickname
ORDER BY v1.value
于 2010-04-23T17:38:45.803 に答える