2012-03-01 19 views
2

私はテーブルにスコアを格納する2人のゲームを持っています。MySQLテーブルを同じ重要度の2列で注文する

Iテーブルからハイスコアを選択したい、これは私の現在のコードである:

SELECT * FROM games ORDER BY GREATEST(player1Score,player2Score) DESC LIMIT 10

問題は、それが2つだけの下であっても、例えば場合、各行の1つのインスタンスが返され上部の行1つのワラント封入でスコア10

+0

テーブルには何行ありますか?あなたはパフォーマンスについて心配する必要がありますか? 'player1Score'や' player2Score'にインデックスがありますか? –

答えて

2

使用UNION ALL

SELECT col1, col2, col3, player1Score AS score FROM games 
UNION ALL 
SELECT col1, col2, col3, player2Score AS score FROM games 
ORDER BY score DESC 
LIMIT 10 

また、SELECT *を使用しないでください。明示的に列をリストします。

+0

パーフェクト、ありがとう! –

0
(SELECT *, player1Score as score 
    FROM games 
    ORDER BY score DESC 
    LIMIT 10 
) 
UNION ALL 
(SELECT *, player2Score AS score 
    FROM games 
    ORDER BY score DESC 
    LIMIT 10 
) 
ORDER BY score DESC 
LIMIT 10 
0

プレイヤーテーブルと参加テーブルを作成する方がよいでしょう(ユーザーが2人しかいなくても)。次に、あなたがしようとしていることを行うためのクエリを簡単に作成することができます。もちろん、新しいスキーマと一致するように更新/保存関数を変更するには少し時間がかかります。

players 
----- 
playerId 
playerName 

joinPlayerGame 
----- 
joinId 
playerId 
gameId 

games 
----- 
modify the player score fields to just be 'score' 

SELECT g.*, p.playerName FROM players p INNER JOIN joinPlayerGame j ON j.playerId = p.playerId INNER JOIN games g ON g.<whatever your key is> = j.gameId ORDER BY g.score DESC LIMIT 10 

私は、幸運を助けることを願っています!

関連する問題