通过MySQL查询插入逗号分隔值

时间:2012-11-14 11:26:35

标签: php mysql sql database

我有一个表(在phpmyadmin中),其中包含以下字段和结构:

Table 1
id  | sponsor
1   | -1 
2   | 1  
3   | 1  
4   | 2  
5   | 4  
6   | 4  

现在我想将上表中的数据插入到新表中,如下所示:

Table 2
id  | children
1   | 2,3
2   | 4 
3   |   
4   | 5,6
5   |   
6   |   

实际上这是Tree结构,我已经保存在mysql数据库中。
我已经在php中编写了一个脚本,但是因为表1中有超过100K的行所以它花了太多时间。请告诉我一个有效的SQL查询来快速完成这项任务。

4 个答案:

答案 0 :(得分:4)

查询:

<强> SQLFIDDLE Example

SELECT 
t1.id,
(SELECT group_concat(id separator ', ')
  FROM table1 t2
   WHERE t2.sponsor = t1.id) AS children
FROM table1 t1
GROUP BY t1.id

结果:

| ID | CHILDREN |
-----------------
|  1 |     2, 3 |
|  2 |        4 |
|  3 |   (null) |
|  4 |     5, 6 |
|  5 |   (null) |
|  6 |   (null) |

插入声明:

INSERT INTO table2
    SELECT 
    t1.id,
    (SELECT group_concat(id separator ', ')
      FROM table1 t2
       WHERE t2.sponsor = t1.id) AS children
    FROM table1 t1
    GROUP BY t1.id

答案 1 :(得分:2)

这与@Justin's answer类似,但使用左连接而不是相关子查询:

INSERT INTO Table2 (id, children)
SELECT
  sp.id,
  GROUP_CONCAT(ch.id) AS children
FROM Table1 sp
LEFT JOIN Table1 ch ON sp.id = ch.sponsor
GROUP BY t1.id
;

可以找到(并使用)at SQL Fiddle演示SELECT语句的结果(该模式是从Justin借来的)。

答案 2 :(得分:1)

您的一个SELECT元素应该是GROUP_CONCAT(...) as column,它将连接用逗号分隔的值。如果您想按其中一个值进行过滤,可以使用GROUP BY -whatever- HAVING find_in_set( -number- , column )

答案 3 :(得分:0)

查看以下内容是否有帮助

INSERT INTO table2
SELECT sponsor, GROUP_CONCAT(id)
FROM table1
GROUP BY id