如何在MySQL中从包含ID的CSV文件中选择项目?

tvz2xvvm  于 2023-07-31  发布在  Mysql
关注(0)|答案(1)|浏览(104)

我有一个包含id的csv文件,我想加载它,并选择所有具有这些id的项目(项目表的所有行);对应的mysql查询是什么?
csv文件如下所示:

item_id
62964
62977
18210
56108
62990
...

字符串
我考虑过做以下几件事:

-- Step 1: Import the CSV file into a temporary table
CREATE TEMPORARY TABLE temp_ids (id INT);

LOAD DATA INFILE '/path/to/your/file.csv'
INTO TABLE temp_ids
FIELDS TERMINATED BY ','
IGNORE 1 LINES;

-- Step 2: Retrieve items based on IDs
SELECT i.*
FROM item i
JOIN temp_ids t ON i.id = t.id;

-- Step 3: Remove the temporary table
DROP TEMPORARY TABLE IF EXISTS temp_ids;


但有没有更好的方法呢?理想情况下,我更喜欢使用VIEW而不是TABLE,这样我就不必在以后删除表;但似乎不可能。

zaqlnxep

zaqlnxep1#

数据表:

CREATE TABLE test (
    item_id INT PRIMARY KEY,
    item_val INT
    );

INSERT INTO test VALUES
(12345, 111),
(18210, 222),
(23456, 333),
(56108, 444),
(62964, 555),
(62970, 666),
(62977, 777),
(62990, 888),
(77777, 999);

字符串
CSV文件(窗口样式):

item_id<CR><LF>
62964<CR><LF>
62977<CR><LF>
18210<CR><LF>
56108<CR><LF>
62990<CR><LF>

1.加载数据

CREATE TEMPORARY TABLE tmp (
    item_id INT
    ) ENGINE = Memory;
    
LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/csv_data.csv'
INTO TABLE tmp
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

SELECT test.*
FROM test 
JOIN tmp ON test.item_id = tmp.item_id;

2. LOAD_FILE()

SELECT test.*
FROM test 
JOIN (SELECT REPLACE(CAST(LOAD_FILE('C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/csv_data.csv') AS CHAR), '\r\n', ',') csv_data) csv
JOIN JSON_TABLE(CONCAT('[', TRIM(BOTH ',' FROM REPLACE(csv.csv_data, 'item_id', '')), ']'),
                '$[*]' COLUMNS (rownum FOR ORDINALITY,
                                item_id INT PATH '$')) jsontable ON test.item_id = jsontable.item_id;


这两个方法都会产生下一个输出(没有ORDER BY,所以行的顺序可能会有所不同):

+---------+----------+
| item_id | item_val |
+---------+----------+
|   18210 |      222 |
|   56108 |      444 |
|   62964 |      555 |
|   62977 |      777 |
|   62990 |      888 |
+---------+----------+
5 rows in set (0.00 sec)

相关问题