2017-01-01 45 views
0

私はかなり集中的なWHERE IN節を使用して、プレイヤーに関連するIDのリストを取得します。FIND_IN_SETでMySQL IN条件を使用する

SELECT p.name, 
    0a.stat_value 
FROM leaderheadsplayers p 
LEFT JOIN leaderheadsplayersdata_alltime 0a 
ON 0a.player_id = p.player_id 
AND 0a.stat_type = 'kills' 
WHERE p.player_id IN 
    (SELECT player_id 
    FROM 
    (SELECT 0a.player_id 
    FROM leaderheadsplayersdata_alltime 0a 
    WHERE 0a.stat_type = 'kills' 
    ORDER BY 0a.stat_value DESC LIMIT 0, 
     20 
    ) 1a 
) 

の問題は、私は再びIN句からの集中的なクエリを実行せずにFIND_IN_SETを使用して、私の最終的な結果にIN句からこれらのIDの順序を維持したいということです。このような 何か:

SELECT p.name, 
    0a.stat_value 
FROM leaderheadsplayers p 
LEFT JOIN leaderheadsplayersdata_alltime 0a 
ON 0a.player_id = p.player_id 
AND 0a.stat_type = 'kills' 
WHERE p.player_id IN 
    (SELECT player_id 
    FROM 
    (SELECT 0a.player_id 
    FROM leaderheadsplayersdata_alltime 0a 
    WHERE 0a.stat_type = 'kills' 
    ORDER BY 0a.stat_value DESC LIMIT 0, 
     20 
    ) 1a 
) 
ORDER BY FIND_IN_SET(p.player_id, result_from_in_clause) 

これは私の現在の出力です:

player_id | stat_value 
3 | 304 
5 | 507 
4 | 208 

は、これは私が取得したいものです。

player_id | stat_value 
5 | 507 
3 | 304 
4 | 208 
+0

Wご注文ですか?サブクエリ内で定義したもの – GurV

+0

@Rovinあなたの最近の編集はあなたの質問を読めないままにしました。 –

+0

編集を確認してください。 –

答えて

1

シンプルorder byはそれを行うことができることができる必要があります:

SELECT p.name, 
    0a.stat_value 
FROM leaderheadsplayers p 
LEFT JOIN leaderheadsplayersdata_alltime 0a 
ON 0a.player_id = p.player_id 
AND 0a.stat_type = 'kills' 
WHERE p.player_id IN 
    (SELECT player_id 
    FROM 
    (SELECT 0a.player_id 
    FROM leaderheadsplayersdata_alltime 0a 
    WHERE 0a.stat_type = 'kills' 
    ORDER BY 0a.stat_value DESC LIMIT 0, 
     20 
    ) 1a 
) 
order by 
    0a.stat_value, p.player_id; 
+0

0a.stat_valueが和のようなものなら、これはパフォーマンスを傷つけませんか? –

+0

MySQL版ではIN節でORDERを使用することができないため、実際にはその冗長サブクエリレベルを使用しなければなりませんでした。それはバイパスのようなものです。 –

+0

@Robin私は見る。期待どおりの結果を生み出しますか? – GurV

関連する問題