在MySQL 8+上,我们可以使用递归CTE:
WITH RECURSIVE cte (id, name, parent_id, orig_id) AS (
SELECT id, name, parent_id, id AS orig_id
FROM tags
WHERE parent_id IS NULL
UNION ALL
SELECT t1.id, t1.name, t1.parent_id, t2.orig_id
FROM tags t1
INNER JOIN cte t2
ON t2.id = t1.parent_id
)
SELECT MAX(p.name) AS name
FROM cte t
LEFT JOIN products p
ON p.tag_id = t.id
GROUP BY t.orig_id
HAVING SUM(t.id = 6) > 0;
这里的策略是在每个产品层次结构的顶部启动递归CTE,这意味着记录没有(NULL)父级。请注意,我们传递了原始父级
id
值,因为我们递归。这意味着我们可以找出层次结构中的哪些产品属于同一组。
然后,我们加入产品表,引入名称,并按
orig_id
集团。匹配是一个层次结构,具有所需的
身份证件
在链条的某个地方。