Mysql присоединиться, чтобы найти "пропущенные" "связанные" строки - PullRequest
1 голос
/ 13 марта 2012

У меня есть отношение собственности между двумя таблицами, скажи users(int user_id) и user_books(int user_book_id,int user_id,int book_id) и две дополнительные таблицы books(int book_id, varchar book_title, int author_id) и authors (int author_id, varchar author_name).

Учитывая конкретный user_id Я хочу получить книги, которые пользователь НЕ ИМЕЕТ, где авторы написали, что у него есть другие книги, написанные им.

Так что, если у пользователя есть BOOK1 (то есть существует строка для этого в user_books) и нет BOOK2 и BOOK3, то, где написано тем же автором, что и BOOK1, я хочу получить идентификаторы для BOOK2 и BOOK3.

Полагаю, я могу сделать это, используя SELECT WHERE NOT IN (), но по соображениям производительности я ищу решение на основе объединения.

1 Ответ

2 голосов
/ 13 марта 2012

Я бы сравнил производительность с «не в» или другим решением, но я думаю, что сработает следующее:

select exist.userId, b.bookTitle, a.authorName  
from (select distinct ub.userId, b.authorId  
         from userBooks ub  
           inner join books b on b.bookId = ub.bookId  
         where ub.userId = @userId) exist  
  inner join Authors a on a.authorId = exist.authorId  
  inner join Books b on b.authorId = a.authorId  
  left outer join userBooks ub on ub.bookId = b.bookId and ub.userId = exist.userId  
where ub.userId is null

Производная таблица находит всех авторов, которые нравятся пользователю, а остальная часть запроса находит другие книги тех же авторов

...