Вы, вероятно, нужно сделать это с помощью рекурсии, например, что-то вроде этой хранимой процедуры ...
DELIMITER //
CREATE PROCEDURE PrintHierachy
(IN parentId DECIMAL(19, 0), IN indent VARCHAR(1000))
BEGIN
DECLARE itemName VARCHAR(255);
DECLARE childId DECIMAL(19, 0);
DECLARE csr CURSOR FOR
SELECT id
FROM MY_TABLE
WHERE parentId = parentId
ORDER BY NAME;
IF parentId > 0 THEN
SELECT itemName INTO FROM MY_TABLE WHERE id=parentId;
% Print it
SELECT concat(indent, itemName);
END IF;
OPEN csr;
child_loop: LOOP
FETCH csr INTO childId;
IF done THEN
LEAVE child_loop;
END IF;
% Recurse
CALL PrintHierachy(concat(' '), childId);
END LOOP;
CLOSE csr;
END;
Это предполагает, что верхний уровень имеет родительские идентификаторы " 0" .
например. ВЫЗОВ PrintHierachy («», 0)
(я не использовал сохраненные проки в MySQL раньше, но есть в других СУБД так что простите меня, если это не компилируется!)
Я хочу заказать категории, как в образец. Не могли бы вы написать предложения sql? – efendi
Рекомендуемое чтение: [Самый эффективный/элегантный способ разобрать плоский стол в дереве?] (Http://stackoverflow.com/questions/192220/what-is-the-most-efficient-elegant-way- to-parse-a-flat-table-in-a-tree), [Найти наивысший уровень иерархического поля: с vs без CTE] (http://dba.stackexchange.com/questions/7147/find-highest- уровень иерархического поля-с-vs-без-ctes) – RandomSeed
Как правило, проблемы отображения данных будут обрабатываться на уровне презентации. – Strawberry