You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL查询IN子句含重复值时如何返回对应次数的行?

问题

我希望通过单条MySQL查询重复获取同一列的结果。执行语句:

SELECT appellation FROM persona WHERE character_id IN (853,12,853) ORDER BY FIELD(character_id,853,12,853)

后,返回结果仅包含两行:

character_id | appellation
---------------------------
853          | John Cena
12           | Chris Brown

但我期望返回三行,即重复显示character_id为853对应的行:

character_id | appellation
---------------------------
853          | John Cena
12           | Chris Brown
853          | John Cena

请问MySQL中是否有实现该需求的方法?

解决方案

原查询里的IN子句会自动对传入的ID去重,不管写多少个重复值,只会保留唯一ID对应的结果,所以没法返回重复行。可以用以下几种方法实现需求:

方法1:用UNION ALL拼接查询

UNION ALL不会对结果去重,为每个需要的ID单独写SELECT语句再拼接即可:

SELECT character_id, appellation FROM persona WHERE character_id = 853
UNION ALL
SELECT character_id, appellation FROM persona WHERE character_id = 12
UNION ALL
SELECT character_id, appellation FROM persona WHERE character_id = 853
ORDER BY FIELD(character_id, 853, 12, 853)

方法2:派生表生成ID列表后关联查询

先构建包含重复ID的派生表,再和原表关联,适合ID数量较多的场景:

SELECT p.character_id, p.appellation
FROM (
    SELECT 853 AS id UNION ALL
    SELECT 12 AS id UNION ALL
    SELECT 853 AS id
) AS ids
JOIN persona p ON p.character_id = ids.id
ORDER BY FIELD(p.character_id, 853, 12, 853)

方法3:MySQL 8.0+ 用JSON_TABLE解析ID数组

如果你的MySQL版本是8.0及以上,可以用JSON_TABLE把包含重复ID的JSON数组转换成临时表,再关联查询:

SELECT p.character_id, p.appellation
FROM JSON_TABLE(
    '[853,12,853]',
    '$[*]' COLUMNS(id INT PATH '$')
) AS ids
JOIN persona p ON p.character_id = ids.id
ORDER BY FIELD(p.character_id, 853, 12, 853)

内容的提问来源于stack exchange,提问作者King Reload

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:25:32