MySQL以多对多关系限制行

时间:2012-02-11 07:59:38

标签: mysql

我有一个包含多对多关系的3个表的数据库。一个是书籍,另一个是作者,第三个是联合(用于加入两者)。数据库是 MySQL

一本书可以由许多作者制作,作者可以制作很多书。

enter image description here

现在我想让书籍(和作者)一起说出8本书。我提出了这个问题:

//first table
SELECT * FROM `books`

//join the junction 
LEFT JOIN books_authors ON books.book_id = books_authors.book_id

//join the authors
LEFT JOIN authors ON books_authors.author_id = authors.author_id

//limit to 8, start at S
limit S, 8

一对一时工作正常。但是当一本书有更多的作者时,比如说每个3,sql结果将总共有8 x 3行(由于结果的2D性质)所有细节。但查询仍然将其剪辑为8 - 我没有得到所有细节。

如何获得8本书的所有细节?

3 个答案:

答案 0 :(得分:2)

您可以限制子查询中的书籍数量:

select  * 
from    (
        select  *
        from    books
        limit   6, 7
        ) b
left join 
        ba ba
on      b.book_id = ba.book_id
left join 
        authors a
on      ba.author_id = a.author_id

答案 1 :(得分:1)

在我的头脑中,我猜你可以尝试像

这样的东西
select * 
from ( select * from books limit s, 8 ) booksLimited
join books_authors on booksLimited.book_id = books_authors.book_id
join authors on books_authors.author_id = authors.book_id

但是我不打算安装mySQL只是为了试试这个。如果它不起作用,请对其进行评论,我将删除答案。

答案 2 :(得分:1)

不知道您的服务器支持哪些SQL功能,但许多人都支持窗口函数。基本上,您按给定作者按特定顺序计算每本书的序号,并仅选择具有小于或等于8的数字(对于某些值为8)。编号由函数ROW_NUMBER():

提供
SELECT * FROM (     
  SELECT a.author_id, b.book_id, a.name, b.title, 
         ROW_NUMBER() OVER (PARTITION BY a.author_id ORDER BY b.title) book_seq
    FROM author a 
    LEFT JOIN book b on a.author_id = b.author_id) dummy
  WHERE book_seq <= 8

在上面,ORDER BY b.title定义了您选择8本最小书记录的顺序。

编辑: mySQL不支持ROW_NUMBER(),所以我的答案不适用。 an interesting article有关于在mySQL中使用OVER(PARTITION)模拟ROW_NUMBER的示例。