Простой запрос для списка первой рекурсии:
select @pv:=id as id, name, parent_id
from products
join (select @pv:=19)tmp
where parent_id=@pv
Результат:
id name parent_id
20 category2 19
21 category3 20
22 category4 21
26 category24 22
... с левым соединением:
select
@pv:=p1.id as id
, p2.name as parent_name
, p1.name name
, p1.parent_id
from products p1
join (select @pv:=19)tmp
left join products p2 on p2.id=p1.parent_id -- optional join to get parent name
where p1.parent_id=@pv
Решение @tincot для перечисления всех дочерних элементов:
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) > 0
and @pv := concat(@pv, ',', id)
Проверьте его онлайн с помощью Sql Fiddle и просмотрите все результаты.