MySQL выбирает уникальные значения из таблицы отношений - PullRequest
2 голосов
/ 10 февраля 2012

В настоящее время я работаю над проектом 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.

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

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

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 голосов
/ 10 февраля 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...