Попробуйте:
LEFT JOIN products p2 on p1.ID = p2.MasterID
И вам не нужно 3 уровня:
SELECT p1.*
, p2.*
FROM (
SELECT * FROM products
WHERE MasterID = 0
LIMIT 100
) p1
LEFT JOIN products p2
ON p1.ID = p2.MasterID
AND p2.Productcode = xyz
Вышеприведенное вернет все основные продукты, связанные с детьми, с Productcode = xyz и всеми остальными.до 100 (не связанных) основных продуктов.
То, что вы описываете с помощью образца, гораздо сложнее:
( SELECT ID
, masterID
, Productcode
FROM products p
WHERE masterID = 0
AND EXISTS
( SELECT *
FROM products p2
WHERE p.ID = p2.MasterID
AND p2.Productcode = 'two'
)
LIMIT 100
)
UNION
( SELECT ch.ID
, ch.masterID
, ch.Productcode
FROM
( SELECT ID
FROM products p
WHERE masterID = 0
AND EXISTS
( SELECT *
FROM products p2
WHERE p.ID = p2.MasterID
AND p2.Productcode = 'two'
)
LIMIT 100
) AS m
JOIN products ch
ON m.ID = ch.MasterID
)
ORDER BY ID