2011-10-25 54 views
0

我有一個CSV文件,其中包含用戶信息:需要在MySQL列插入CSV值到另一個表

'Arlington', '1,3,5,7,9' 
'StackExchange', '2,3' 

我將需要進口這樣上面的信息:

「用戶」表:

id | name 
1 | 'Arlington' 
2 | 'StackExchange' 

「用戶組」 表:

id | user_id | group_id 
1 | 1  | 1 
2 | 1  | 3 
3 | 1  | 5 
4 | 1  | 7 
5 | 1  | 9 
6 | 2  | 2 
7 | 2  | 3 

最簡單的方法是什麼?我曾與一個臨時指定持有CSV值導入的數據:

id | name   | tmp_group_ids 
1 | 'Arlington'  | '1,3,5,7,9' 
2 | 'StackExchange' | '2,3' 

我在想,如果我導入這樣一來,我就知道到底是什麼ID被分配給用戶(users表中的ID列是auto_increment),所以我可以將該id用作user_id作爲「用戶組」表。

但是現在如何從tmp_group_ids中的值到「用戶組」表中?

將不勝感激任何幫助!謝謝!

回答

1

簡單的方法將是一個PHP或Perl腳本。

0

您可以使用MySQL SUBSTRING()函數來拆分字符串並將不同的值插入表中。您可以通過編寫函數或使用存儲過程來完成此操作。

+0

如果有在CSV字段沒有字符被轉義,至少。鑑於此,這將是最直接的解決方案。 –

0

我最近也有類似的問題,我用的功能SUBSTRING_INDEX(STR,DELIM,計數),使用 「」 作爲分隔符

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring-index

INSERT INTO tableUserGroup (userid, groupid) 
SELECT 
    t1.id 
    , substring_index(t1.tmp_group_ids,',',2) 
    , substring_index(t1.tmp_group_ids,',',3) 
FROM table1 t1 
+0

在SE上發現了類似問題:[link](http://stackoverflow.com/questions/7647499/mysql-extract-data-from-csv-string-and-insert-into-a-second-table) 所以我想如果我知道CSV列中最多有N個值,我可以調用N次,因爲它是快速和骯髒的? (user_id,group_id) SELECT id,substring_index – Arlington

0

首先,將名稱爲User表 - 與id自動編號,這將工作:

INSERT INTO User 
    (name) 
SELECT DISTINCT 
    name 
FROM TempTable 

然後:

--- Create a "numbers" table: 
CREATE TABLE num 
(i INT PRIMARY KEY 
) ; 

--- Populate it with numbers: 
INSERT INTO num 
    (i) 
VALUES 
    (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); 

然後,您可以使用FIND_IN_SET()功能,是非常方便的這種情況(拆分逗號分隔的字段),像這樣:

INSERT INTO User_Groups 
    (user_id, group_id) 
SELECT 
    u.id AS user_id 
    , num.i AS group_id 
FROM User AS u 
    JOIN TempTable AS t 
    ON t.name = u.name 
    JOIN num 
    ON FIND_IN_SET(num.i, t.tmp_group_ids) > 0 
相關問題