Для MySQL 8.0 и выше:
WITH RECURSIVE `subs` (`name`, `value`, `order`) AS (
SELECT CONCAT('{{> ', `p`.`name`, '}}'), `p`.`value`, ROW_NUMBER() OVER ()
FROM `templates` AS `t`
JOIN `parts` AS `p`
ON `t`.`value` LIKE CONCAT('%{{> ', `p`.`name`, '}}%')
WHERE `t`.`id` = 1
),
`result` (`value`, `order`) AS (
SELECT `value`, 0
FROM `templates`
WHERE `id` = 1
UNION SELECT REPLACE(`r`.`value`, `s`.`name`, `s`.`value`), `s`.`order`
FROM `result` AS `r`
JOIN `subs` AS `s`
ON `s`.`order` = `r`.`order` + 1
)
SELECT `value`
FROM `result`
ORDER BY `order` DESC
LIMIT 1
Для старых версий даже пробовать не буду, мне столько не выпить.