SQL join возвращает нулевые записи, когда в базе данных нет данных - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь получить информацию о форуме и количество тем и сообщений. Я использую mysql

SELECT forums.id, forums.url, forums.title, forums.description, 
       forums.icon, COUNT(topics.id) topics, COUNT(posts.id) posts 
FROM forums JOIN 
     topics 
     ON forums.id = topics.to_forum JOIN 
     posts 
     ON topics.id = posts.to_topic 

Но когда нет форума, нет топи c, нет сообщений, которые он возвращает enter image description here

Я пытался использовать левое соединение, правое соединение, внутреннее соединение (как я читал на inte rnet), но, похоже, ничего не работает. Левое объединение работает только в том случае, если форум уже создан, чем заполняет данные. Мне нужно, чтобы он не возвращал никаких записей, если нет форума, созданного без этой NULL-неявности. Вот структуры таблиц, в базе данных нет данных, поэтому я не понимаю, почему он возвращает это

Форумы enter image description here

Темы enter image description here

Сообщений enter image description here

1 Ответ

1 голос
/ 31 января 2020

Попробуйте добавить GROUP BY forums.id к вашему запросу.

Вы смешиваете агрегатные (COUNT()) операции с обычными операциями над столбцами в одном и том же SELECT. Если вы дадите какие-либо агрегатные операции и не дадите GROUP BY, вы всегда получите ровно одну строку назад от SELECT. В стандартном SQL ваш запрос не удастся. MySql в нестандартном режиме: он пытается угадать, что вы хотите в неагрегированных столбцах. Если нет строк для подсчета, он угадывает NULL.

Прочитайте это: dev. mysql .com / doc / refman / 8.0 / en / group-by-processing. html

Другими словами, как только вы используете COUNT() в запросе, вам нужно понимать GROUP BY, даже если вы не включили его в запрос.

...