Как выбрать все родительские категории в одну колонку?

Чтобы выбрать все родительские категории в одну колонку в SQL, вы можете использовать рекурсивный запрос, используя общую таблицу выражения (CTE). Рекурсивные запросы позволяют выполнять итерацию по набору данных, в данном случае категорий, чтобы получить все родительские категории для каждого элемента.

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

WITH RECURSIVE category_hierarchy AS (
    SELECT id, name, parent_id, CAST(name AS VARCHAR(255)) AS full_path
    FROM categories
    WHERE parent_id IS NULL
    
    UNION ALL
    
    SELECT c.id, c.name, c.parent_id, CONCAT(ch.full_path, ' > ', c.name)
    FROM categories c
    INNER JOIN category_hierarchy ch ON c.parent_id = ch.id
)
SELECT full_path
FROM category_hierarchy
WHERE id = <id_категории>

В этом примере используется общая таблица выражения (CTE) "category_hierarchy", которая содержит две части:

1. Начальный запрос (запись до UNION ALL), выбирает корневые категории, то есть те, у которых значение столбца "parent_id" равно NULL. В этом запросе мы выбираем столбцы "id", "name" и "parent_id" и также создаем столбец "full_path", который представляет собой путь к текущей категории (начально это просто имя категории).

2. Рекурсивная часть (запись после UNION ALL), которая выполняется до тех пор, пока возвращается непустой набор данных. В этой части мы объединяем таблицу "categories" с общей таблицей выражения "category_hierarchy" по условию, что значение "parent_id" в таблице "categories" совпадает со значением "id" в общей таблице выражения. Мы также обновляем столбец "full_path", добавляя к уже существующему пути имя текущей категории.

Наконец, после определения общей таблицы выражения мы выполняем обычный SELECT для выбора только столбца "full_path" для определенной категории, указанной в условии WHERE (замените <id_категории> на фактическое значение идентификатора категории).

Таким образом, этот запрос вернет все родительские категории для указанной категории, разделенные знаком " > ".