Самым удачным способом избежать этого - счетчики на триггерах.
Что такое счетчик (в данном контексте)? Это поле которое хранит количество нужных записей и обновляется при каждом изменении считаемых строк (но не с помощью count(*), как некоторые подумали=).
Вернемся к нашим пользователям и их комментариям. В таблице пользователей создадим поле "comments_count". На таблицу комментариев нужно повесить триггер или триггеры, в зависимости от используемой базы данных.
На событие insert:
UPDATE "user" SET comments_count = comments_count + 1
WHERE id = NEW.user_id;
На событие delete:
UPDATE "user" SET comments_count = comments_count - 1
WHERE id = OLD.user_id;
Если у вас данные не удаляются, а используется поле для маркировки удаленных записей, то сюда нужно еще добавить триггер на update, и везде проставить условия.
Если счетчики сбиваются (у покрытых тестами маловероятно), то можно выполнить синхронизацию.
UPDATE "user" SET comments_count = (
SELECT COUNT(*) FROM "comment"
WHERE "user".id = "comment".user_id
);
20 коммент.: