2016-06-30 3 views
0

У меня есть следующие схемы и запроса, который захватывает каждый элемент вложенного набора и возвращает разделенный запятыми список своих предков:MySQL Динамическая Осевая От Уплотненный Set

CREATE TABLE Tree 
(title varchar(20) PRIMARY KEY, 
`tree` int, 
`left` int, 
`right` int); 

INSERT Tree 
VALUES 
("Food", 1, 1, 24), 
('Fruit', 1, 2, 13), 
('Red', 1, 3, 8), 
('Cherry', 1, 4, 7), 
('Cherry_pie', 1, 5, 6), 
('Yellow', 1, 9, 12), 
('Banana', 1, 10, 11), 
('Meat', 1, 14, 23), 
('Beef', 1, 15, 16), 
('Pork', 1, 17, 22), 
('Bacon', 1, 18, 21), 
('Bacon_Sandwich', 1, 19, 20); 

Query

SELECT T0.title node 
    ,(SELECT GROUP_CONCAT(T2.title ORDER BY T2.left) 
       FROM Tree T2 
       WHERE T2.left < T0.left AND T2.right > T0.right 
       ) ancestors 
FROM Tree T0 
GROUP BY T0.title; 

Fiddle: http://sqlfiddle.com/#!9/0a854/10

Результат:

title   | ancestors 
-------------------------- 
Bacon   | Food,Meat,Pork 
Bacon_Sandwich | Food,Meat,Pork,Bacon 
Banana   | Food,Fruit,Yellow 
etc..... 

Я хотел бы повернуть/разделять предок и отдельные числовые возглавляемые столбцы, например, так:

title   | 1 | 2  | 3  | 4  
---------------------------------------------- 
Bacon   | Food | Meat | Pork | 
Bacon_Sandwich | Food | Meat | Pork | Bacon 
Banana   | Food | Fruit | Yellow | 
etc..... 

Предки могли быть буквально все, у меня нет никакого способа знать, что и сколько будет ,

У меня нет понятия, с чего начать, но если это поможет, я могу использовать подготовленные заявления, хранимые процедуры, функции .. весь shebang.

ответ

1

В одну сторону вы можете задать свой вопрос. он разделит результат по вашему запросу:

SELECT 
    d.node 
    , REVERSE(SUBSTRING_INDEX(REVERSE (SUBSTRING_INDEX(CONCAT(d.ancestors,',,,,'), ',', 1)),',',1)) AS `1` 
    , REVERSE(SUBSTRING_INDEX(REVERSE (SUBSTRING_INDEX(CONCAT(d.ancestors,',,,,'), ',', 2)),',',1)) AS `2` 
    , REVERSE(SUBSTRING_INDEX(REVERSE (SUBSTRING_INDEX(CONCAT(d.ancestors,',,,,'), ',', 3)),',',1)) AS `3` 
    , REVERSE(SUBSTRING_INDEX(REVERSE (SUBSTRING_INDEX(CONCAT(d.ancestors,',,,,'), ',', 4)),',',1)) AS `4` 

FROM (
    SELECT T0.title node 
     ,(SELECT GROUP_CONCAT(T2.title ORDER BY T2.left) 
         FROM Tree T2 
         WHERE T2.left < T0.left AND T2.right > T0.right 
        ) ancestors 
    FROM Tree T0 
    GROUP BY T0.title 
) AS d; 
+0

Это работает для меня ... Оно не касается неизвестного количества предков, но будет работать для меня промежуточный. – superphonic