Объединение таблиц при условии

#mysql #sql

Вопрос:

У меня есть эта классическая проблема с sql How many copies of the book titled The Lost Tribe are owned by each library branch?

Я решил эту проблему, получив ветви, у которых есть копии, но есть ли способ получить все ветви, и это заполнит noOfCopies, которые содержат заголовок, и введите null, если нет? Я пробовал левое, внутреннее и правое соединения, но не смог этого понять.

 select l.branchName,  r.noOfCopies

from (tbl_library_branch as l
join tbl_book_copies as r
on l.branchId = r.branchId)
right join  tbl_book as bk
on r.bookId = bk.bookId
where title in ('The Lost Tribe');
 

Комментарии:

1. Большинству людей main table left join optional data гораздо легче понять, чем optional data right join main table .

2. Вы можете изучить операторы набора sql, такие как «объединение». Вы также можете рассмотреть функцию «если null» для замены нулевых значений нулями.

Ответ №1:

Вероятно, вам нужно что-то вроде следующего. Начните с таблицы, из которой вам требуются все строки, и присоединитесь к результату фильтрации вашей книги по названию:

 select b.branchName, coalesce(c.noOfCopies,0) noOfCopies
from tbl_library_branch b
left join (
    select bc.branchId, bc.noOfCopies
    from tbl_book b 
    join tbl_book_copies bc on bc.bookId=b.bookId
    where b.title = 'The Lost Tribe'
)c on c.branchId = b.branchId;
 

Комментарии:

1. Спасибо. Когда вы выполняете соединение слева, а затем (), это возвращает объединенную таблицу b и bc, которую мы называем c?

2. Да, терминология для этого является производной таблицей — результат этого запроса сам по себе считается таблицей для объединения.

3. потрясающе, еще раз спасибо!