我有一个包含多对多关系的3个表的数据库。一个是书籍,另一个是作者,第三个是联合(用于加入两者)。数据库是 MySQL
一本书可以由许多作者制作,作者可以制作很多书。
现在我想让书籍(和作者)一起说出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本书的所有细节?
答案 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的示例。