Подтвердить что ты не робот

MySQL Несколько левых объединений

Я пытаюсь создать страницу новостей для веб-сайта, над которым я работаю. Я решил, что хочу использовать правильные запросы MySQL (что означает COUNT (id) и объединяет вместо нескольких запросов или num_rows.) Я использую оболочку PDO, которая должна функционировать нормально, и это все еще не выполняется при запуске непосредственно через MySQL CLI.

В принципе, у меня есть 3 таблицы. Один держит новости, один держит комментарии, а один держит пользователей. Моя цель здесь - создать страницу, которая отображает все (позже будет разбита на страницы) заголовки новостей, тела, авторы и даты. Это отлично работало, когда я использовал второй запрос для получения имени пользователя, но потом решил, что лучше использовать JOIN.

Так в чем проблема? Ну, мне нужно два объединения. Один из них - получить имя пользователя автора, а другое - получить количество комментариев. Когда я просто использую имя пользователя автора, все работает так, как ожидалось. Отображаются все строки (есть 2) в таблице новостей. Однако, когда я добавил эту вторую LEFT JOIN для строки комментариев, я получаю только одну строку из новостей (помните, что есть 2,) и COUNT (comments.id) дает мне 2 (она должна отображать 1, так как у меня есть комментарий для каждого сообщения.)

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

SELECT news.id, users.username, news.title, news.date, news.body, COUNT(comments.id)
FROM news
LEFT JOIN users
ON news.user_id = users.id
LEFT JOIN comments
ON comments.news_id = news.id

Кроме того, чтобы быть уверенным в другом, мое левое соединение с комментариями - это правильный способ получить все сообщения независимо от того, есть ли у них комментарии или нет, правильно? Или это будет подходящее соединение? О, последнее, что... если я переключу comments.news_id = news.id на news.id = comments.news_id, я получаю 0 результатов.

4b9b3361

Ответ 1

У вас отсутствует предложение GROUP BY:

SELECT news.id, users.username, news.title, news.date, news.body, COUNT(comments.id)
FROM news
LEFT JOIN users
ON news.user_id = users.id
LEFT JOIN comments
ON comments.news_id = news.id
GROUP BY news.id

Левое соединение правильное. Если вы использовали INNER или RIGHT JOIN, вы не получили бы новости, у которых не было комментариев.

Ответ 2

Чтобы отобразить все данные для каждого заголовка новостей, т.е. "news.id", который является основным ключом, вам нужно использовать предложение GROUP BY для "news.id"

SELECT news.id, users.username, news.title, news.date,
       news.body, COUNT(comments.id)
FROM news
LEFT JOIN users
ON news.user_id = users.id
LEFT JOIN comments
ON comments.news_id = news.id
GROUP BY news.id