好的,所以我一直在研究这个 SQL 语句,只是想不通。我需要能够看到客户在 2017 年借用的前 5 位作者。我的表格看起来像这样
1. Client - fields (clientId,clientFirstName,clientlastName,clidentDoB)
2.author - fields (AuthorID, AuthorFirstname, AuthorLastname,AuthorNation )
3. book - fields (BookId, BookAuthor,BookTitle,BookGenre)
4. borrower - fields (borrowID,BorrowDate, ClientID,BookId)
所以我知道我需要从作者表中提取姓名,根据借阅的书籍数量,我也知道borrower.bookId 等于book.BookId 和Author.AuthorID 等于Book.BookAuthor。我应该能够对其进行设置,以便它看到 2017 年借来的书籍,然后通过使用 borrowBookId 并将相同 Id 的每个实例添加在一起并查看 bookID 与 book 表中的 BookAuthor 匹配,然后使用它来比较用于打印名字和姓氏的 ID。
我努力了
SELECT author.authorfirstname,author.authorlastname
FROM author Join ON author.authorid = book.bookauthor
WHERE (borrower.borrowdate <='31/12/2017' AND borrower.borrowdate >= '01/01/2017');
我知道这行不通,但我不确定如何在作者和借款人之间架起一座桥梁。
样本数据和预期输出。
好的。假设我有 4 位作者,我们想要前 3 位。我们也只有 2017 年的借阅。客户端表并不是真正需要的,所以让我们用一些数据填充其他表。与原始问题示例中相同的表字段名称将是
作者表
(1,bob,ross, USA)
(2, fred, martin, USA)
(3, alex,joe,CAN)
(4, dan, reed, can)
书桌
(1,1,bobsbook,fantasy)
(2,1,bobagain,fantasy)
(3,1,returnofbob,fantasy)
(4,2,fredsadventure,fantasy)
(5, 2, fedagain, fantasy)
(6, 2, fedstrikes, fantasy)
(7,3,alexjoes, fantasy)
(8, 3, alexjoeagain,fantasy)
(9,4, dansbook, fantasy)
借表
(1, 20/01/2017,,1, 1)
(2, 20/01/2017,,3, 2)
(3, 20/01/2017,,2, 1)
(4, 20/01/2017,,1, 3)
(5, 20/01/2017,,6, 2)
(6, 20/01/2017,,8, 4)
(7, 20/01/2017,,4, 4)
(8, 20/01/2017,,9, 6)
(9, 20/01/2017,,2, 7)
(10, 20/01/2017,,3, 9)
(11, 20/01/2017,,4, 9)
最终结果将是
AuthorFirstName AuthorLastname
bob ross
Fred Martin
Dan Reed
这是因为他们在 2017 年日期范围内的借阅次数最多,按顺序排列,bob 为 5,fred 为 3,dan 为 2。它也只打印前 3 人,因此 alex joe 被排除在列表之外。
@fahmi 给出的代码
SELECT author.authorfirstname,author.authorlastname
FROM author
Join book ON author.authorid = book.bookauthor
join borrower on book.bookid=borrower.bookid
WHERE borrower.borrowdate <='31/12/2017' AND borrower.borrowdate >= '01/01/2017'
;
这给了我一个作者列表,它列出了洞穴的每个实例,但我需要合并列表,所以我只看到一个名字,所以它是按大多数借用的顺序排列的,并自我限制。