2013-06-27 8 views
0

Я видел одну статьи, 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 

ответ

0

Откуда берутся идентификаторы? Предположим, у вас есть другая таблица с идентификаторами по каждому пункту, то код может выглядеть примерно так:

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 
+0

Спасибо, что помогли мне после 10 дней поиска в большом количестве форумов, теперь только у меня есть два вопроса: 1- О (Предположим, у вас есть другая таблица с идентификаторами на элемент), то есть я должен определить новую таблицу с идентификатором autonumber, item, а затем вставить все элементы со всех уровней с различным ключевым словом. 2- Как я могу иметь поле позиции в моем запросе. Например, родительский элемент TUBE, LCD, PLASMA - ТЕЛЕВИЗОРЫ теперь мне нужно значение поля позиции, которое дает значение каждой позиции (0, 1, 2, 3 ...) в соответствии с алфавитным порядком. – masoud