То, что вы делаете, это антипаттерн SQL, который я называю Goldberg Machine . Зачем усложнять проблему, заставляя ее выполнять один SQL-запрос?
Вот как бы я действительно решил эту проблему:
SELECT t.*, COUNT(c.id) as comments
FROM topics t
LEFT JOIN comments c ON c.topic_id = t.id
WHERE t.id = 9;
SELECT t.*, SUM(v.vote) as votes
FROM topics t
LEFT JOIN votes v ON v.topic_id = t.id
WHERE t.id = 9;
Как вы обнаружили, объединение этих двух в один запрос приводит к декартову произведению. Могут быть хитрые и тонкие способы заставить его дать вам правильный ответ в одном запросе, но что произойдет, когда вам понадобится третья статистика? Гораздо проще сделать это в двух запросах .