2017-01-01 9 views
0

У меня есть запрос, в котором я использую довольно интенсивное предложение WHERE IN, чтобы получить список идентификаторов, связанных с игроками.Использовать условие MySQL IN в FIND_IN_SET

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, не делая интенсивный запрос из пункта снова. Что-то вроде этого:

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 не позволяет использовать ORDER в разделе IN. Это своего рода обход. –

+0

@Robin я вижу. Получает ли он результат, как вы ожидаете? – GurV