我有三张桌子:贷款,预订和书籍。书籍表具有“noOfCopies”的属性,该书的贷款和预订总数不能超过该数字。
预订表有一个“时间戳”列,它只是预订的时间戳。这个想法是,当一本书被退回时,最早的预订会得到这本书。
以下是我需要帮助的内容:我需要创建一个SQL视图,该视图将显示每本书的所有最早预订,但仅限于该书可用的位置。
任何人都可以为此提供SQL吗?提前谢谢。
这是我已经拥有的SQL:我认为它显示了书籍可用的所有预订,并且即将继续确定最早显示的方式 - 然后我最早没有到达,然后意识到这一点实际上并没有起作用:
CREATE VIEW `view_bookLoans` AS
SELECT count(l.`id`) as loanCount, l.`bookISBN`,b.`noOfCopies` FROM
loans l INNER JOIN books b
ON l.`bookISBN` = b.`ISBN`
GROUP BY l.`bookISBN`;
CREATE VIEW `view_reservationList` AS
SELECT
r.`timestamp`,
b.`title` as `bookTitle`,
r.`readerID`,
bl.`loanCount`
FROM
`reservations` r INNER JOIN `books` b
ON r.`bookISBN` = b.`ISBN`
LEFT JOIN
view_bookLoans bl
ON bl.`bookISBN` = b.`ISBN`
WHERE
(b.`noOfCopies` - bl.`loanCount`) > 0;
答案 0 :(得分:0)
我在关于如何排除已经填写的预订或已经退回的贷款的问题中提出的评论除外......这应该为你做。
我只会查看人们保留的那些书籍,从而开始列表。为什么查询和没有人对他们感兴趣的书籍的整个列表......然后,扩展您的标准。内部查询直接从预订列表上的书籍开始。这是LEFT JOINED到贷款表(如果没有剩余贷款)。我正在提取每本书预订的最早时间戳,并获得按ISBN分组的LOAN书籍总数。
根据该结果,我立即重新加入预订,以便根据最早的ISBN和时间戳进行匹配,以获得世界卫生组织的预期。
现在结局...在ISBN和你的限定符上的书籍表中加入(不是LEFT JOIN)可用的副本数量...减去已经借出的数量是> 0
显然,您可以根据需要添加order by子句。
确保您在(bookISBN,timestamp)上的预订表上有一个索引用于查询优化。此外,贷款表也应该有一个ISBN索引。
SELECT
B.Title,
R2.readerID,
R2.timeStamp,
Wanted.AlreadyLoandedOut,
B.noOfCopies - Wanted.AlreadyLoanedOut as ShouldBeAvailable
FROM
( select
R.bookISBN,
MIN( R.timeStamp ) EarliestReservation,
COALESCE( COUNT( L.ID ), 0 ) as AlreadyLoanedOut
from
reservations R
LEFT JOIN Loans L
ON R.bookISBN = L.bookISBN
group by
R.bookISBN ) as Wanted
JOIN reservations R2
ON Wanted.bookISBN = R2.bookISBN
AND Wanted.EarliestReservation = R2.timeStamp
JOIN books B
ON Wanted.bookISBN = B.ISBN
AND B.noOfCopies - Wanted.AlreadyLoanedOut > 0