2016-06-17 3 views
0

Я бы хотел выплевывать результаты базы данных, которые сгруппированы по родительскому идентификатору.Запрос, сгруппированный по одному столбцу

У меня есть следующая таблица:

`pages` 
    `id` int 
    `parent_id` int 
    `title` varchar 

Некоторые pages имеют parent_id от 0, это означает, что они не имеют родителя.

Допустим, у меня есть следующие строки в pages таблице:

id | parent_id | title 
1 | 0   | Colors 
2 | 1   | Red 
3 | 1   | Green 
4 | 1   | Blue 
5 | 0   | Devices 
6 | 5   | Mobile 
7 | 5   | Desktop 
8 | 5   | Tablet 

Учитывая эти строки, я хочу, чтобы вывести следующее на моем PHP странице:

Colors 
    Red 
    Green 
    Blue 

Devices 
    Mobile 
    Desktop 
    Tablet 

Я знаю, что я могу используйте запрос, чтобы получить строки с parent_id из 0, а затем еще один запрос, чтобы получить строки с parent_id этого id.

Можно ли написать это как единый запрос?

+0

Вы можете также разделить эти два запроса? Легко понять, чего вы хотите? – C2486

ответ

1

Да, но это не очень: у вас иерархическая структура данных (родительский/дочерний), и для упорядочивания вещей таким образом в одном запросе требуются рекурсивные запросы, которые mysql не поддерживает.

Вам нужно сделать автообъединение для каждого уровня иерархии у вас есть:

SELECT parent.*, child.* 
FROM yourtable AS parent 
LEFT JOIN yourtable AS child ON parent.id = child.parent_id 

Для каждого уровня дерева, вам нужно другое присоединиться/псевдоним, как описано выше.

0

Я думаю, что вы ищете следующее решение:

SELECT 
    t1.title as parent, t2.title 
FROM 
    pages AS t1 
LEFT JOIN pages AS t2 
    ON t1.id = t2.parent_id 
WHERE 
    t2.id IS NOT NULL 

Вы получите результат, как:

parent title 
Colors Red 
Colors Green 
Colors Blue 
Devices Mobile 
Devices Desktop 
Devices Tablet 

Теперь вы должны расположить его в вас PHP стороне.

Вот sqlfiddle ссылка: http://sqlfiddle.com/#!9/11fa6/3

Смежные вопросы