Так что на самом деле, когда вы делаете это (то, что вы делаете, переформулировано для JOIN):
SELECT post.post_id, COUNT(comment)
FROM `comment`
INNER JOIN post ON `comment`.post_id = post.post_id
GROUP BY post.post_id;
Вы собираете только посты, имеющие хотя бы одну ссылку в комментарии.
Если вы измените тип JOIN на ЛЕВОЕ объединение , таким образом:
SELECT post.post_id, COUNT(comment)
FROM `comment`
LEFT JOIN post ON `comment`.post_id = post.post_id
GROUP BY post.post_id;
Тогда все строки из post будут там, и значения NULL будут вставлены для столбцов комментариев, если комментариев нетсвязанный с этой строкой существует (это левое соединение).Таким образом, если комментарий является столбцом из комментария таблицы, он будет там для каждой строки таблицы сообщений, но со значением NULL, после группировки по столбцу post_id подмножество комментариев, относящихся к этому сообщению, содержит только 1 значение NULL, количестводолжен вернуть 0.
select count(NULL);
возвращает 0.
Теперь вы можете использовать подзапрос, но это очень плохая идея, подзапросы обычно выполняются вместо LEFT JOINS, обычно этоошибка , иногда это не так, но это действительно часто ошибка.Когда вы выполняете левое соединение, индексы используются для сравнения значений ключей 2 таблиц (предложение ON) и построения одного окончательного «временного» результата строк, смешивая значения из обеих таблиц (а затем или, может быть, в одно и то же время,фильтры из других частей ваших запросов применяются).Когда вы используете подзапрос, для каждой строки первой таблицы запускается новый запрос, чтобы получить результаты из второй таблицы (не всегда, но это другая проблема), затраты для механизма базы данных значительно выше.