2012-02-10 39 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 2012-02-10 04:15:44

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 2012-02-10 04:13:50