Как правильно запрашивать с нескольких сторон отношения в sql?

#mysql #sql

#mysql #sql

Вопрос:

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

 class Book {
  String title;
  List<Author> authors;
}
  

Я либо могу получить всю книгу, написанную конкретным автором, и не могу получить других авторов книги со следующим запросом

 SELECT b.*, a.*
FROM book AS b
INNER JOIN book_author AS ba ON ba.book_id = b.book_id
INNER JOIN author AS a ON a.author_id = ba.author_id
WHERE a.author_id = 1;
  

Или получить все книги и отфильтровать книги, написанные этим конкретным автором, в серверной части.

Каков наилучший способ получить желаемый набор строк?

Ответ №1:

Попробуйте настроить ваше условие WHERE.

В настоящее время вы используете одного автора для фильтрации результатов. Что вы действительно хотите, так это отфильтровать по всем книгам, у которых есть этот автор, что-то вроде этого;

 SELECT b.*, a.*
FROM book AS b
INNER JOIN book_author AS ba ON ba.book_id = b.book_id
INNER JOIN author AS a ON a.author_id = ba.author_id
WHERE ba.book_id IN (SELECT bai.book_id FROM book_author bai WHERE bai.author_id = 1);