Вот выбор для одного уровня:
SELECT m.priceper + SUM(s1.qty * m2.priceper) AS priceper
FROM main m
LEFT JOIN sub s1 ON (m.id = s1.parentid)
LEFT JOIN main m2 ON (m2.id = s1.childid)
-- WHERE m.id = 1
GROUP BY m.id;
Для 2-х уровней это будет что-то вроде этого (я не мог попробовать, возможно, нужно исправить):
SELECT m1.id, m1.priceper + IFNULL(SUM(s1.qty * g2.priceper),0) AS priceper
FROM main m1
LEFT JOIN sub s1 ON (m1.id = s1.parentid)
LEFT JOIN (
SELECT m2.id, m2.priceper + IFNULL(SUM(s2.qty * g2.priceper),0) AS priceper
FROM main m2
LEFT JOIN sub s2 ON (m2.id = s2.parentid)
LEFT JOIN main g2 ON (g2.id = s2.childid)
GROUP BY m2.id)
g2 ON (g2.id = s1.childid)
-- WHERE m1.id = 1
GROUP BY m1.id;
Для детализации необходимо заменить основную таблицу подзапросом для g3 и т. Д. *
SELECT m1.id, m1.priceper + IFNULL(SUM(s1.qty * g2.priceper),0) AS priceper
FROM main m1
LEFT JOIN sub s1 ON (m1.id = s1.parentid)
LEFT JOIN (
SELECT m2.id, m2.priceper + IFNULL(SUM(s2.qty * g2.priceper),0) AS priceper
FROM main m2
LEFT JOIN sub s2 ON (m2.id = s2.parentid)
LEFT JOIN (
SELECT m3.id, m3.priceper + IFNULL(SUM(s3.qty * g3.priceper),0) AS priceper
FROM main m3
LEFT JOIN sub s3 ON (m3.id = s3.parentid)
LEFT JOIN main g3 ON (g3.id = s3.childid)
GROUP BY m3.id) g2
ON (g2.id = s2.childid)
GROUP BY m2.id) g2
ON (g2.id = s1.childid)
-- WHERE m1.id = 1
GROUP BY m1.id;
Для 4 уровней это выглядит так:
SELECT m1.id, m1.priceper + IFNULL(SUM(s1.qty * g2.priceper),0) AS priceper
FROM main m1
LEFT JOIN sub s1 ON (m1.id = s1.parentid)
LEFT JOIN (
SELECT m2.id, m2.priceper + IFNULL(SUM(s2.qty * g2.priceper),0) AS priceper
FROM main m2
LEFT JOIN sub s2 ON (m2.id = s2.parentid)
LEFT JOIN (
SELECT m3.id, m3.priceper + IFNULL(SUM(s3.qty * g3.priceper),0) AS priceper
FROM main m3
LEFT JOIN sub s3 ON (m3.id = s3.parentid)
LEFT JOIN (
SELECT m4.id, m4.priceper + IFNULL(SUM(s4.qty * g4.priceper),0) AS priceper
FROM main m4
LEFT JOIN sub s4 ON (m4.id = s4.parentid)
LEFT JOIN main g4 ON (g4.id = s4.childid)
GROUP BY m4.id) g3
ON (g3.id = s3.childid)
GROUP BY m3.id) g2
ON (g2.id = s2.childid)
GROUP BY m2.id) g2
ON (g2.id = s1.childid)
-- WHERE m1.id = 1
GROUP BY m1.id;