Похоже, что события и темы должны быть в одной таблице.
Тем не менее, я думаю, что мы можем сделать это с СОЮЗОМ. Надеюсь, у событий и тем есть одинаковые столбцы? (Или хотя бы те же важные?)
(SELECT c.table as event_or_topic, e.*, count(C.table), MAX(C.created_at) as latest_c
FROM events E LEFT JOIN comments C on (C.post_id = E.id)
WHERE C.table = 'Events'
GROUP BY C.post_id)
UNION
(SELECT c.table as event_or_topic, t.id*, count(C.table), MAX(C.created_at) as latest_c
FROM topics T LEFT JOIN comments C on (C.post_id = E.id)
WHERE C.table = 'Topics'
GROUP BY C.post_id)
ORDER BY latest_c
Обратите внимание, что ORDER BY применяется ко всему UNION, а не к отдельным SELECT.
Использование LEFT JOIN должно позволить тем строкам без комментариев все еще показываться. Я думаю, проблема в том, что у нас есть части нашего выбора, зависящие от комментариев (то есть - C.table, упорядочивание по последнему комментарию и т. Д.). Счет должен быть в порядке - будет просто нулем, если нет комментариев.
Возможно, вам придется немного изменить часть SELECT. Я хотел бы показать C.table, чтобы вы знали, является ли строка темой или событием, но я боюсь, что это может исказить счет. Вам нужно что-нибудь из комментариев, кроме подсчета? В вашем запросе вы используете столбцы, отличные от post_id и table, которые не указали в своем вопросе.
У вас все еще есть столбцы, я не знаю, какие они есть, например, ZoneTable для комментариев