2017-01-01 79 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 
) 

的問題是,我想用FIND_IN_SET沒有再做從IN子句密集的查詢,以保持這些ID的從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 
) 
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