2017-01-01 86 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