在 FIND_IN_SET 中使用 MySQL IN 条件
Use MySQL IN condition in FIND_IN_SET
我有一个查询,我使用一个非常密集的 WHERE 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
)
问题是我想通过使用 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
简单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;
我有一个查询,我使用一个非常密集的 WHERE 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
)
问题是我想通过使用 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
简单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;