プラットフォーム: MySQL/PHP
シナリオ:プレイヤーのすべてのフレンドを含むフレンド リーダーボードを作成し、1 つのクエリ内でリーダーボードにプレイヤーを含めます。
詳細:選択したプレイヤーとそのすべての友達が結果に含まれるクエリを作成しようとしています。優勝回数が多い方で順位を決定します。
質問:これは単一のクエリ内で実行できますか、それとも結果セットを取得してから、各フレンドの勝利数とプレイヤーの勝利数を比較して順位を決定する方が速いですか?
その他の詳細:
これは、プレイヤーとその友達を勝利と合計金額とともに返すクエリです。
SELECT a.profile_id, 'player', a.win AS player_wins, b1.profile_id AS friend_id,
b1.handle AS friend_handle, b1.win AS friend_wins, b1.bankroll AS friend_bank
FROM ldrbrd_cache_tmp a, buddy_tbl b, ldrbrd_cache_tmp b1
WHERE a.profile_id = b.profile_id
AND b.buddy_id = b1.profile_id
AND a.profile_id <> 1
AND b.buddy_id <> 1
AND a.profile_id = 2
ORDER BY a.profile_id, b1.win DESC;
結果:
id | name | player-wins | friend-id | friend-name | friend-wins | friend-money
'2','player' ,'200' ,'50' ,'Freddy K' ,'303' ,'10004572'
'2','player' ,'200' ,'53' ,'dannn' ,'217' ,'92065'
'2','player' ,'200' ,'51' ,'YoDood' ,'126' ,'2383600'
'2','player' ,'200' ,'58' ,'princess' ,'19' ,'89565'
'2','player' ,'200' ,'71' ,'com-on' ,'8' ,'-9530'
'2','player' ,'200' ,'57' ,'foolzzz' ,'7' ,'210'`
結果は、プレーヤーの勝利数が 200 であることを示しているため、この場合、プレーヤーは 3 位にランク付けされます。
プレイヤーが勝ったことにお気付きでしょうが、プレイヤーの勝利と友人の勝利を比較して、同じ SQL ステートメント内でランキングを返すにはどうすればよいでしょうか? または、結果を配列に割り当ててから、プレーヤーがどこに収まるかを判断するのが最善の方法ですか?
編集: だから私は機能するUNIONを思いつきました.これが唯一のオプションですか??
SELECT profile_id, handle, win FROM (
SELECT a.profile_id, a.handle, a.win
FROM ldrbrd_cache_tmp a
WHERE a.profile_id = 2
UNION ALL SELECT b1.profile_id, b1.handle, b1.win
FROM ldrbrd_cache_tmp a, buddy_tbl b, ldrbrd_cache_tmp b1
WHERE a.profile_id = b.profile_id
AND b.buddy_id = b1.profile_id
AND a.profile_id <> 1
AND b.buddy_id <> 1
AND a.profile_id = 2
ORDER BY profile_id, win DESC) AS player_ranking
ORDER BY win DESC;
誰かがより良い解決策を持っていない限り、これは今のところうまくいくようです?