Есть таблицы people, people_has_book и books. Я хочу, чтобы все люди в моем списке, но не у всех есть книга, поэтому я использую LEFT JOIN для связывания people с people_has_book, но связывание people_has_book с книгами не должно быть LEFT JOIN.
Как мне это сделать?
Не могли бы вы привести мне пример того, как вы бы это сделали?
... from people p left join people_has_book phb on phb.people_id = p.id left join books b on phb.book_id = b.idЯ протестировал простой случай, и он действительно сработал, но я как-то заметил, что в более обширных случаях я получаю некоторые странные результаты, но я не уверен, в каких случаях это будет ... ;-)


Вы можете использовать скобки для определения приоритета объединений. Нравится:
SELECT *
FROM people p
LEFT JOIN ( people_has_book pb JOIN books b USING (book_id) ) USING (people_id);
Это неуловимо разные от двух LEFT JOIN:
SELECT *
FROM people p
LEFT JOIN people_has_book pb USING (people_id)
LEFT JOIN books b USING (book_id);
Последний будет отображать строки из people_has_book, даже если в books нет соответствующей записи. тем не мение, в классической реализации «многие ко многим» с ограничениями FK, обеспечивающими ссылочную целостность, обычно нет эффективной разницы для вашего конкретного запроса, поскольку все people_has_book.book_id в любом случае должны ссылаться на существующую строку в books - за экзотическим исключением значений NULL. (Если (people_id, book_id) является ПК people_has_book, оба столбца автоматически являются NOT NULL.)
Связанный:
Это оно! Спасибо!
Хорошо, если вам нужно сделать соединение между
people_has_bookиbooksвнешним соединением, в противном случае дырочная «цепочка соединений» ведет себя как внутреннее соединение. Как вы думаете, почему вам не следует этого делать?