MySQL中传入重复ID,如何用IN子句获取对应数量的多条数据?
嘿,这个问题我之前做项目时也遇到过!MySQL的IN子句本身会自动对传入的ID去重,所以直接用SELECT * FROM table WHERE id IN (1,2,3,1,2)只会返回3条唯一的记录,没法得到你想要的5条。不过有几个靠谱的办法能解决这个需求,我给你详细说说:
方案1:用
UNION ALL构造带重复ID的临时表关联查询 这是最直接的办法,把你需要的ID列表用UNION ALL拼成一个临时数据集,再和原表做JOIN,这样就能保留重复的ID对应的记录了。示例代码如下:
SELECT t.* FROM your_table t JOIN ( SELECT 1 AS id UNION ALL SELECT 2 AS id UNION ALL SELECT 3 AS id UNION ALL SELECT 1 AS id UNION ALL SELECT 2 AS id ) temp_ids ON t.id = temp_ids.id;
这个方法的好处是顺序和你传入的ID列表完全一致,而且逻辑简单易懂,适合ID列表固定的场景。
方案2:动态ID列表(字符串形式)的处理
如果你的ID列表是从应用层传来的逗号分隔字符串(比如'1,2,3,1,2'),可以用字符串拆分结合数字序列的方式来实现。
适用于所有MySQL版本的写法
先手动生成一个足够长度的数字序列(长度等于ID的个数),再拆分字符串:
SELECT t.* FROM your_table t JOIN ( SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('1,2,3,1,2', ',', n), ',', -1) AS id FROM ( SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 ) number_sequence ) temp_ids ON t.id = temp_ids.id;
MySQL 8.0+ 更灵活的写法(递归CTE)
如果你的MySQL版本是8.0及以上,可以用递归CTE自动生成数字序列,不用手动写UNION ALL:
WITH RECURSIVE number_sequence(n) AS ( SELECT 1 UNION ALL SELECT n + 1 FROM number_sequence WHERE n < 5 -- 这里的5是ID列表的总个数 ) SELECT t.* FROM your_table t JOIN ( SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('1,2,3,1,2', ',', n), ',', -1) AS id FROM number_sequence ) temp_ids ON t.id = temp_ids.id;
注意事项
- 如果你的
id字段是字符串类型,要确保临时表中生成的id也是字符串类型(比如给数字加引号:SELECT '1' AS id),避免类型转换导致的匹配问题。 - 如果原表中某个ID不存在,JOIN后对应的记录会被过滤掉。如果需要保留这些“不存在的ID”对应的空记录,可以把
JOIN换成LEFT JOIN。
内容的提问来源于stack exchange,提问作者Safan
相关产品推荐
相关产品推荐

