Звучит так, будто вы испытываете декартово произведение , потому что нет прямой связи между программами и темами.
Вы можете использовать GROUP_CONCAT () , если хотитесписок программ или тем, разделенных запятыми, которые «сгруппированы», как вы говорите.Но только одно выражение для программы и темы.
SELECT item.*,
GROUP_CONCAT(program.some_col) AS clummped_programs,
GROUP_CONCAT(topic.some_col) AS clumped_topics
FROM item
LEFT JOIN program ON ...
LEFT JOIN topic ON ...
GROUP BY item.id
Но проще и удобнее выполнять несколько запросов, чтобы избежать декартова произведения.
SELECT item.*, program.*
FROM item
LEFT JOIN program ON ...
SELECT item.*, topic.*
FROM item
LEFT JOIN topic ON ...
Соблазнительно попытаться заставить все работать в одном запросе SQL, но иногда это не правильный способ решения проблемы.