Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Связи и исключения


Автор: Defiline 18.8.2011, 03:46
Ночь ... холодно ... еле думается.

Есть три таблицы (классическая связь many-to-many):

books
Код

id   |   name
 1   |   Книга 1
 2   |   Книга 2


authors
Код

id   |   name
 1   |   Саша
 2   |   Маша
 3   |   Даша
 4   |   Каша


authors_books
Код

author_id  |  book_id
  1             |       1
  1             |       2
  1             |       4
  2             |       1


Т.е. книгу 1 писали Саша,  Маша и Каша.
Я составляю запрос, который "жадно" выбирает:

Код

Книга 1     |    Саша
Книга 1     |    Маша
Книга 1     |    Каша
Книга 2     |    Саша


Проблема:
Нужно выбрать только те книги, которые написала Саша. В результате так же должны присутствовать все авторы это книги (результат, по внешнему виду, ничем не должен отличаться от примера выше. Разница лишь в том, что если я хочу выбрать книги, которые писала Маша, то получу:

Код

Книга 1     |    Саша
Книга 1     |    Маша
Книга 1     |    Каша


Проблема всегда в том, что выбирает сейчас так:
Код

Книга 1     |    Маша


Т.е. все другие авторы теряются.

Автор: sir_nuf_nuf 18.8.2011, 10:23
Код

select b.name, a.name 
from books b 
inner join authors_books ab on b.id = ab.book_id 
inner join authors a on ab.author_id = a.id
where b.id in  (
  select b.id 
  from books b 
  inner join authors_books ab on b.id = ab.book_id 
  inner join authors a on ab.author_id = a.id 
  where a.name = 'Маша'
) T;

Автор: Defiline 18.8.2011, 13:31
Пасиба, it works!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)