需要在MySQL列中将CSV值插入另一个表

时间:2011-10-25 09:41:32

标签: 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获取“用户组”表中的值?

非常感谢任何帮助!谢谢!

4 个答案:

答案 0 :(得分:1)

简单的方法是php或perl脚本。

答案 1 :(得分:0)

您可以使用MySQL SUBSTRING()函数拆分字符串并将不同的值插入表中。您可以通过编写函数或使用存储过程来完成此操作。

答案 2 :(得分:0)

我最近遇到过类似的问题,我使用函数SUBSTRING_INDEX(str,delim,count),使用“,”作为分隔符

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

答案 3 :(得分: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