MySQL count не возвращает 0, если запись не найдена - PullRequest
4 голосов
/ 25 июля 2011

Хотя я исследовал эту тему и наткнулся на несколько решений, таких как использование JOIN LEFT или подзапросов, я все еще не могу получить желаемый результат, так как я не силен в MySQL. Я в большей степени веб-дизайнер, пытающийся использовать простой php на своем сайте лучше для школьного проекта.

Я пытаюсь создать веб-приложение, похожее на блог. Я хотел подсчитать, сколько комментариев есть к сообщению, и показать число, которое увидят мои пользователи, но если для этой строки нет комментариев, мой запрос ничего не даст вместо 0.

Это мой запрос ниже:

SELECT post.post_id, COUNT(comment) 
FROM `comment`, post 
WHERE `comment`.post_id = post.post_id 
GROUP BY post.post_id

Результат:

Record | post_id | COUNT(comment)
1      | 12      | 2
2      | 13      | 1
3      | 15      | 1
4      | 16      | 1

Как видите, post_id 14 не имеет комментариев, поэтому мой запрос ничего не возвращает. Что я должен сделать, чтобы мой результат выглядел следующим образом?

Record | post_id | COUNT(comment)
1      | 12      | 2
2      | 13      | 1
3      | 14      | 0
4      | 15      | 1
5      | 16      | 1

Кроме того, было бы хорошо, если бы вы, ребята, дали мне ссылки или ссылки, чтобы понять концепцию решения, поскольку я хочу узнать больше о php:)

Ответы [ 2 ]

7 голосов
/ 25 июля 2011

Так что на самом деле, когда вы делаете это (то, что вы делаете, переформулировано для 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) и построения одного окончательного «временного» результата строк, смешивая значения из обеих таблиц (а затем или, может быть, в одно и то же время,фильтры из других частей ваших запросов применяются).Когда вы используете подзапрос, для каждой строки первой таблицы запускается новый запрос, чтобы получить результаты из второй таблицы (не всегда, но это другая проблема), затраты для механизма базы данных значительно выше.

1 голос
/ 25 июля 2011

Запрос таблицы записей и выполнение подзапроса для подсчета в запросе комментариев.

SELECT post.post_id, (SELECT COUNT(comment) FROM `comment` WHERE `comment`.post_id = post.post_id) as comments FROM post

Это может быть очень медленным с лотами или строками, поэтому добавьте ограничение на пейджер, когда вы дойдете до этой точки.

...