У меня есть таблица с пунктами, которые находятся во взаимоотношениях ManyToMany с категорией.
Пункт
id | name
1 name1
2 name2
3 name3
ItemCategory
id | category_id | item_id
1 4 1
2 5 1
3 7 1
4 8 1
Категория (внешний ключ parent_id для себя)
id | parent_id | name
1 Null A1
2 1 B1
3 1 B2
4 2 C1
5 3 C2
6 1 D1
7 6 DE
8 1 DT
Я пытаюсь получить Категории элементов от дочернего элемента к родителю для Элемента, поэтому я использую:
WITH RECURSIVE descendants(name, id, slug, parent_id, bread_order) AS (
SELECT name, id, slug, parent_id, 0
FROM categories
where id in (
SELECT c.id FROM items AS p
INNER JOIN items_categories AS pc ON p.id=pc.item_id
INNER JOIN categories AS c ON pc.category_id = c.id
WHERE p.id = 10
)
UNION ALL
SELECT c2.name, c2.id, c2.slug, c2.parent_id, bread_order+1
FROM categories AS c2
INNER JOIN descendants AS d ON c2.id=d.parent_id
) SELECT id, name, parent_id, bread_order FROM descendants
ORDER by bread_order DESC
Проблема в том, что две дочерние категории могут иметь одного и того же родителя, или родитель для одной является родителем для другой.
C1 -> B1 -> A1
C2 ->B1 -> A1
C3 ->B2 -> A1
DE -> D1 -> A1
DT -> A1
Я пытался сгруппировать их, но, поскольку у меня одни и те же родители, grand_parents - это не то, что мне нужно, мне нужно, когда я получаю информацию из базы данных, чтобы знать, как проложить путь (см. Выше).
Есть ли способ, например, использовать CASE с идентификаторами, которые возвращаются из подзапроса?