2012-02-10 5 views
2

В настоящее время я работаю над проектом MYSQL, который имеет несколько довольно стандартных отношений многих и многих.MySQL выбирает уникальные значения из таблицы отношений

Я показал очень упрощенную таблицу отношений, чтобы помочь моему примеру.

table: book_authors 
ID BOOKS AUTHORS 
1  1  4 
2  1  5 
3  4  4 
4  4  5 
5  2  6 
6  2  1 
7  2  5 
8  3  6 
9  3  5 
10 3  1 
12 5  2 
13 6  2 
14 7  5 

Что я ищу, чтобы добиться того, чтобы быть в состоянии выбрать все книги, которые указанные авторы, и получить только книги, которые соответствуют всем прилагаемым авторов. Число авторов, запрошенных каждый раз, также является переменной.

Так что, если я ищу все книги, написанные автором 4 и автором 5, я получу результат только для книг 1 и 4. Если я ищу книги, написанные только автором 5, я получу только книгу 7.

ответ

1

Я не думаю, что есть очень гладкий способ сделать это, но если производительность не является большой проблемой, вы можете использовать MySQL's GROUP_CONCAT function и написать это:

SELECT books 
    FROM book_authors 
WHERE books IN 
     (SELECT books 
      FROM book_authors 
      WHERE authors = 4 
     ) 
GROUP 
    BY books 
HAVING GROUP_CONCAT(authors ORDER BY authors) = '4,5' 
; 

(Оговорка WHERE даже не требуется для правильных результатов, но делает запрос менее безвозмездно дорогостоящим.)

+0

Это идеальный вариант. Спасибо. Я не слишком беспокоюсь о производительности, так как запрос не запускается очень сильно. – m4rv

0

Если это один вы можете сделать: не очень повторяемый.

select distinct 
    ba1.books 
from 
    book_authors ba1 
join 
    book_authors ba2 
    on ba1.id<>ba2.id and ba1.books=ba2.books 
where 
    ba1.authors=5 
    and ba2.authors=4 

редактировать: забыли часть присоединиться

+0

Спасибо за ваш ответ, вот где я начал, но я не мог сделать его масштабным для ряда авторов. – m4rv

Смежные вопросы