我目前正在开发一个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册。
答案 0 :(得分: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
子句来获得正确的结果,但它使得查询的费用更低。{/ p>
答案 1 :(得分: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
编辑:忘记了部分加入