[英]How to pagination with one-to-many relationship tables in sql?
基本上我想写一个 API,客户会说“我想要 5 本书,我需要知道你有多少本书”并且 api 应该返回前 5 本书和总书数。
我有 Book Table,每本书都可以翻译一种以上的语言,所以我把它放在单独的表中。
这是我的书桌:
这是BookLanguages 表:
客户端调用: api/books?index=0&take=5
预期结果:
{
Books:
[
{
"Name": "Harry Potter and the Philosopher's Stone",
"Languages": "en,de,ch"
},
{
"Name": "Harry Potter and the Order of the Phoenix",
"Languages": "en,ch"
},
{
"Name": "Harry Potter and the Half-Blood Prince",
"Languages": "en,ch"
},
{
"Name": "The Hobbit",
"Languages": "ch,de"
},
{
"Name": "The Fellowship Of The Ring",
"Languages": "ch,en"
}
],
TotalCount:8
}
我的结果:
{
Books:
[
{
"Name": "Harry Potter and the Philosopher's Stone",
"Languages": "en,de,ch"
},
{
"Name": "Harry Potter and the Order of the Phoenix",
"Languages": "en,ch"
}
],
TotalCount:8
}
我的 sql 代码如下所示:
SELECT * FROM Books B
LEFT JOIN BookLanguages L ON L.BookId = B.Id
连接表如下所示:
而且我用OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY
取 5 行。 所以它只给出了2本不同的书。 但如你所知,我需要 5 种不同语言的不同书籍。
约束: API 还具有语言和颜色过滤选项。 所以我不能先拿 5 本书然后加入 BookLanguages 表。 (API 可以是api/books?index=0&take=5&language=ch
)
注意:当然书籍不是我真正的问题,我只是想让问题变得简单。 我必须进行多个联接(具有一对多关系)
我正在使用 mssql
问题明确后的解决方案
SELECT b.id,
b.name,
b.color,
bl.language
FROM books b
JOIN booklanguages bl ON
bl.bookid = b.id
WHERE b.id >= (SELECT TOP 1 id FROM books ORDER BY id OFFSET 15) AND
b.id <= (SELECT TOP 1 id FROM books ORDER BY id OFFSET 19)
ORDER BY b.id, bl.language
只需将 15 和 19 更改为所需的值即可更改为分页选择的范围。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.