Чтобы выбрать все родительские категории в одну колонку в 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_категории> на фактическое значение идентификатора категории).
Таким образом, этот запрос вернет все родительские категории для указанной категории, разделенные знаком " > ".