mysql - 显示有可用书籍的最早预订

标签 mysql sql

我有三个表:贷款、预订和书籍。 books 表具有“noOfCopies”属性,该书的外借和预订总数不能超过该数字。

预订表有一个“时间戳”列,它只是进行预订的时间戳。这个想法是,当还书时,最早预订的人下一个得到这本书。

以下是我需要帮助的事情:我需要创建一个 SQL View ,该 View 将显示每本书的所有最早预订,但仅显示该书有售的地方。

谁能给我这个的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;

最佳答案

除了我在关于如何排除已填写的预订或已归还的贷款的问题中提出的评论之外......这应该为您完成。

我会首先查看人们预订的那些书。为什么要查询没有人对它们感兴趣的完整书籍列表……然后,扩展您的标准。内部查询直接从预订列表中的书籍开始。这是 LEFT JOINED 到贷款表(以防没有剩余的贷款)。我正在为每本书提取最短的预订时间戳,并获取按 ISBN 分组的外借图书条目的总数。

根据这个结果,我立即重新加入预订,根据最早的 ISBN 和时间戳进行匹配,以获得 WHO 想要的。

现在是结局...加入(不是 LEFT JOIN)到 ISBN 和您的限定符上的书籍表,可用的副本数量...减去已借出的数量 > 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

关于mysql - 显示有可用书籍的最早预订,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9805018/

相关文章:

java - JPA - 选择、连接、子查询和最大值

c# - 使用 Mysql 作为 Sharp Develop 的嵌入式应用程序数据库

mysql - groovy中连接mysql时找不到合适的驱动

Python MySQL 语句返回错误

mysql - 如何获取按匹配属性数量排序的查询行?

sql - Amazon Athena - 将时间戳转换为日期?

mysql - Group by Mysql 查询问题

PHP PDO If 语句检查删除语句中的字段是否为空

mysql - 如何使用带有连接的 SQL 查询获取所有条目

java - 与 postgreSQL 数据库连接的非法 UTF-8 序列