SELECT count(DISTINCT p.id) FROM post p JOIN comment c on p.id = c.post_id вернёт вам количество уникальных id постов. То есть именно количество постов вне зависимости от того, сколько к каждому прилагается комментов.
SELECT count(*) FROM post p JOIN comment c on p.id = c.post_id вернёт вам не количество постов, а количество выбранных строк, то есть в данном случае количество комментов во всех постах.
Константин Т: запрос считает количество моделей Bill, а не количество возвращаемых строк. Возвращает сразу — это ожидаемо. Инстанциировать модели смысла нет.
Константин Т: при count() модели и не создаются. Если сделать all(), а не count(), то у вас в результате получится ровно 10 моделей Bill. Это вам count() и посчитал.
Группировать контроллеры в модуль есть смысл: можно для этой группы, например, сделать дополнительную авторизацию или ещё чего в модуле. Модели туда же можно закинуть вполне. Но в common у нас контроллеров нет, так что и модуль особо не имеет смысла там делать.