MySQL从关系表中选择唯一值

时间:2012-02-10 03:42:56

标签: mysql sql

我目前正在开发一个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 个答案:

答案 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

编辑:忘记了部分加入