Набросал некоторые примеры, приближенные к описанной задаче.
Постановка задачи не полная (модель, форматы данных, сортировка, критерии отбора, какая СУБД - ничего не описано), но суть думаю реализовал. + обратите внимание на ответ
Руслан ., там информации уже достаточно для реализации. + Полезно прочитать как "
Вычисление рекурсивного запроса" например в документации Postgre
Демонстрационный "расширенный" пример см. по
ссылке + укороченный и чуть скорректированный под ваш пример вариант кода на Postgre ниже
with recursive cte(id, title, url, hierarchy) as (
SELECT
id,
title,
url,
null::text as hierarchy
from
site_resources
where
parent = 0
--and published = 1 AND template = 10 --В условиях задачи не сказано про эти критерии, но в примере они есть. Раскомментить, если нужно
union all
SELECT
sr.id,
sr.title,
sr.url,
coalesce(cte.hierarchy || ', ', '') || sr.title
from
cte
inner join
site_resources as sr on
cte.id = sr.parent
--and sr.published = 1 AND sr.template = 10 --Аналогично комменту выше + если надо так отфильтровать только корневые элементы, то вся эта строка тут не нужна
)
SELECT
sr.title as 'Название',
sr.url as 'Урл',
sr.hierarchy as 'Иерархия',
coalesce(meta1.value, sr.title) as 'Title',
coalesce(meta2.value, sr.description) as 'Description'
FROM
cte as sr
LEFT JOIN `site_extrafields` meta1 ON meta1.resid = sr.id AND meta1.fieldid = 4
LEFT JOIN `site_extrafields` meta2 ON meta2.resid = sr.id AND meta2.fieldid = 5;