对于MySQL 8+:使用递归with语法。 对于MySQL 5.x:使用内联变量,路径ID或自联接。
MySQL 8+ with recursive cte (id, name, parent_id) as ( select id, name, parent_id from products where parent_id = 19 union all select p.id, p.name, p.parent_id from products p inner join cte on p.parent_id = cte.id ) select * from cte; 中指定的值parent_id = 19应设置为id您要选择其所有后代的父级的。
MySQL 5.x 对于不支持通用表表达式的MySQL版本(最高5.7版),您可以通过以下查询来实现:
select id, name, parent_id from (select * from products order by parent_id, id) products_sorted, (select @pv := '19') initialisation where find_in_set(parent_id, @pv) and length(@pv := concat(@pv, ',', id)) 这是一个小提琴。
在此,@pv := '19'应将中指定的值设置为id要选择其所有后代的父级的值。
如果父母有多个孩子,这也将起作用。但是,要求每个记录都满足条件parent_id < id,否则结果将不完整。
查询中的变量分配 该查询使用特定的MySQL语法:在执行过程中分配和修改变量。对执行顺序进行了一些假设: