如何在MySQL中从含ID的CSV文件筛选数据?求更优实现方案
解决方案:从CSV的ID筛选MySQL item表数据
为什么无法用VIEW实现
MySQL的VIEW是基于SQL查询生成的虚拟表,仅能通过现有表的查询结果构建数据,无法直接将CSV文件加载到VIEW中,所以你想用VIEW替代临时表的思路确实不可行。
优化后的临时表方案(最推荐)
你的原思路本身可行,还能进一步简化:会话级临时表会在数据库会话结束后自动销毁,无需手动执行DROP TEMPORARY TABLE,简化后的步骤如下:
-- 创建会话级临时表(会话结束自动删除) CREATE TEMPORARY TABLE temp_ids (id INT); -- 加载CSV数据,忽略表头行 LOAD DATA INFILE '/path/to/your/file.csv' INTO TABLE temp_ids FIELDS TERMINATED BY ',' IGNORE 1 LINES; -- 关联查询获取对应item的完整数据 SELECT i.* FROM item i INNER JOIN temp_ids t ON i.id = t.id;
替代方案1:直接使用IN子句(适合ID数量少的场景)
如果CSV中的ID数量不多,可以把ID整理成逗号分隔的列表,直接用IN子句查询:
SELECT * FROM item WHERE id IN (62964, 62977, 18210, 56108, 62990);
注意:若ID数量上千甚至更多,这种方法会导致SQL语句过长,查询性能下降,不推荐使用。
替代方案2:使用mysqlimport命令行工具
如果允许通过命令行操作,可先借助mysqlimport将CSV导入临时表,再执行查询:
# 导入CSV到临时表,忽略表头,指定列名为id mysqlimport --local --user=你的用户名 --password=你的密码 你的数据库名 /path/to/your/file.csv --ignore-lines=1 --columns=id --temp-table
随后执行查询语句:
SELECT i.* FROM item i INNER JOIN temp_ids t ON i.id = t.id;
--temp-table参数会让mysqlimport自动创建临时表,会话结束后自动销毁。
内容的提问来源于stack exchange,提问作者arthur.sw
相关产品推荐
相关产品推荐

