0

私は1つの記事を見 ましたhttp://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ カテゴリテーブルのデータの下を使用する

  category_id | name                 | parent |
+-------------+----------------------+--------+
|           1 | ELECTRONICS          |   NULL |
|           2 | TELEVISIONS          |      1 |
|           3 | TUBE                 |      2 |
|           4 | LCD                  |      2 |
|           5 | PLASMA               |      2 |
|           6 | PORTABLE ELECTRONICS |      1 |
|           7 | MP3 PLAYERS          |      6 |
|           8 | FLASH                |      7 |
|           9 | CD PLAYERS           |      6 |
|          10 | 2 WAY RADIOS         |      6 |

以下のクエリで、以下のデータを返します。

  SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
 FROM category AS t1
 LEFT JOIN category AS t2 ON t2.parent = t1.category_id
 LEFT JOIN category AS t3 ON t3.parent = t2.category_id
 LEFT JOIN category AS t4 ON t4.parent = t3.category_id
 WHERE t1.name = 'ELECTRONICS';

 +-------------+----------------------+--------------+-------+
 | lev1        | lev2                 | lev3         | lev4  |
 +-------------+----------------------+--------------+-------+
 | ELECTRONICS | TELEVISIONS          | TUBE         | NULL  |
 | ELECTRONICS | TELEVISIONS          | LCD          | NULL  |
 | ELECTRONICS | TELEVISIONS          | PLASMA       | NULL  |
 | ELECTRONICS | PORTABLE ELECTRONICS | MP3 PLAYERS  | FLASH |
 | ELECTRONICS | PORTABLE ELECTRONICS | CD PLAYERS   | NULL  |
 | ELECTRONICS | PORTABLE ELECTRONICS | 2 WAY RADIOS | NULL  |
 +-------------+----------------------+--------------+-------+
6 rows in set (0.00 sec)

今私の質問は、以下のデータを持つテーブルまたはクエリがあるかどうかです

  +-------------+----------------------+--------------+-------+
  | lev1        | lev2                 | lev3         | lev4  |
  +-------------+----------------------+--------------+-------+
  | ELECTRONICS | TELEVISIONS          | TUBE         | NULL  |
  | ELECTRONICS | TELEVISIONS          | LCD          | NULL  |
  | ELECTRONICS | TELEVISIONS          | PLASMA       | NULL  |
  | ELECTRONICS | PORTABLE ELECTRONICS | MP3 PLAYERS  | FLASH |
  | ELECTRONICS | PORTABLE ELECTRONICS | CD PLAYERS   | NULL  |
  | ELECTRONICS | PORTABLE ELECTRONICS | 2 WAY RADIOS | NULL  |
  +-------------+----------------------+--------------+-------+

以下のデータを返す逆クエリを作成する方法:

   category_id | name                 | parent |
   +-------------+----------------------+--------+
 |           1 | ELECTRONICS          |   NULL |
 |           2 | TELEVISIONS          |      1 |
 |           3 | TUBE                 |      2 |
 |           4 | LCD                  |      2 |
 |           5 | PLASMA               |      2 |
 |           6 | PORTABLE ELECTRONICS |      1 |
 |           7 | MP3 PLAYERS          |      6 |
 |           8 | FLASH                |      7 |
 |           9 | CD PLAYERS           |      6 |
 |          10 | 2 WAY RADIOS         |      6 |

この逆クエリでレベル フィールド (0 または 1 または...) の値も取得できれば、非常に良かったです。

   category_id | name                 | parent |position

   +-------------+----------------------+--------+-------
 |           1 | ELECTRONICS          |   NULL |0
 |           2 | TELEVISIONS          |      1 |0
 |           3 | TUBE                 |      2 |3
 |           4 | LCD                  |      2 |1
 |           5 | PLASMA               |      2 |2
4

1 に答える 1

0

IDはどこから来たのですか?アイテムごとに ID を持つ別のテーブルがあるとします。コードは次のようになります。

select i.ID, l.lev1 as Name, NULL as Parent
from IDTable i 
     join LevelTable l on i.Name = l.lev1
union
select i.ID, l.lev2 as Name, (select j.ID from IDTable j where j.Name = l.lev1)
from IDTable i 
     join LevelTable l on i.Name = l.lev2
union
select i.ID, l.lev3 as Name, (select j.ID from IDTable j where j.Name = l.lev2)
from IDTable i 
     join LevelTable l on i.Name = l.lev3
于 2013-06-27T06:19:53.920 に答える