Учитывая следующие данные и структуру таблицы:
id name parent_id ================================ 1 food NULL 2 snacks 1 3 cakes 2 4 birthdays 3
Я хотел бы выводить эти строки вместе со всеми их родительскими категориями. Поэтому, например, я хотел бы сгенерировать запрос для вывода данных следующим образом:
id name parent_id parent_1 parent_2 parent_3 =================================================================== 1 food NULL NULL NULL NULL 2 snacks 1 1 NULL NULL 3 cakes 2 1 2 NULL 4 birthdays 3 1 2 3
При этом я могу легко получить идентификаторы каждого родительского уровня данной категории.
Я пробовал делать это, используя подзапросы, но не вполне удалось это исправить. Вот что я пробовал:
SELECT id, name, parent_id, parent_id AS _parent_1, (SELECT parent_id FROM categories WHERE id = _parent_1) AS _parent_2, (SELECT parent_id FROM categories WHERE id = _parent_2) AS _parent_3 FROM `categories`
РЕДАКТИРОВАТЬ: На основе отзывов, кажется, будет сложно получить данные в нужном формате.
По крайней мере, возможно ли получить все дочерние категории данной категории? Так, например, для идентификатора категории 1, он должен выводить три категории под ним (или четыре, если он будет включать данную категорию).
Вы можете просто присоединяться к таблице несколько раз, чтобы удовлетворить максимальную глубину вложенности. Это может выглядеть так:
SELECT c.id AS id, c.name AS name, parent.id AS parent, grandparent.id AS grandparent, greatgrandparent.id AS greatgrandparent /* add other columns based on max depth of nesting */ FROM categories AS c LEFT JOIN categories AS parent ON c.parent_id = parent.id LEFT JOIN categories AS grandparent ON parent.parent_id = grandparent.id LEFT JOIN categories AS greatgrandparent ON grandparent.parent_id = greatgrandparent.id /* keep joining based on max depth of nesting */