Если вы используете агрегатную функцию для выбора, SQL свернет все ваши строки в одну строку.
Чтобы получить более 1 строки, вы должны использовать предложение group by
.
Затем SQLбудет генерировать итоги для каждого пользователя.
Самый быстрый вариант
SELECT
u.id
, (SELECT(COUNT(*) FROM blogs b WHERE b.user_id = u.id) as blogcount
, (SELECT(COUNT(*) FROM messages m WHERE m.user_id = u.id) as messagecount
FROM users u
Почему ваш код не работает
SELECT u.id, count(b.id), count(m.id)
FROM users u
LEFT JOIN blogs b ON b.user_id = u.id <<-- 3 matches multiplies # of rows *3
LEFT JOIN messages m ON m.user_id = u.id <<-- 5 matches multiplies # of rows *5
GROUP BY u.id
Счет будет выключен, потому что вы подсчитываете повторяющиеся элементы.
Простое исправление, но оно будет медленнее, чем вариант 1
Если вы будете считать только разные идентификаторы, вы получите правильныйрассчитывает:
SELECT u.id, count(DISTNICT b.id), count(DISTINCT m.id)
FROM users u
LEFT JOIN blogs b ON b.user_id = u.id
LEFT JOIN messages m ON m.user_id = u.id
GROUP BY u.id