4

次のフィールドと構造を持つ1つのテーブル(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   |   

実はこれは私がmysqlデータベースに保存したツリー構造です。
私はすでにphpでスクリプトを作成しましたが、表1には100Kを超える行があるため、時間がかかりすぎます。このタスクをすばやく実行するための効率的なSQLクエリを教えてください。

4

4 に答える 4

4

クエリ:

SQLFIDDLEの例

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
于 2012-11-14T12:23:21.637 に答える
2

これは@Justinの回答に似ていますが、相関サブクエリの代わりに左結合を使用します。

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
;

SELECTステートメントの結果のデモンストレーションは、SQL Fiddle(スキーマはJustinから借用されています)で見つけることができます(そして試してみることができます)。

于 2012-11-14T13:18:24.083 に答える
1

SELECT要素の1つは、GROUP_CONCAT(...) as columnコンマで区切られた値を連結する、である必要があります。これらの値の1つでフィルタリングする場合は、次を使用できます。GROUP BY -whatever- HAVING find_in_set( -number- , column )

于 2012-11-14T11:31:08.353 に答える
0

以下が役立つかどうかを確認してください

INSERT INTO table2
SELECT sponsor, GROUP_CONCAT(id)
FROM table1
GROUP BY id
于 2012-11-14T11:31:38.990 に答える