Показать самые ранние бронирования, где книги доступны - PullRequest
1 голос
/ 21 марта 2012

У меня есть три таблицы: кредиты, бронирование и книги. Таблица книг имеет атрибут 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;

1 Ответ

0 голосов
/ 21 марта 2012

За исключением комментариев, которые я вставил в вопрос о том, как исключить уже заполненные резервирования или уже возвращенные кредиты ... Это СЛЕДУЕТ сделать для вас.

Я бы начал список, только посмотрев нате книги, которые люди зарезервировали.Зачем запрашивать и весь список книг, где никто не заинтересован в них ... ТО, расширяйте свои критерии.Внутренний запрос начинается непосредственно с книг в списке бронирования.То есть осталось присоединено к таблице ссуд (если на ссуде не осталось ни одного).Я извлекаю самую раннюю отметку времени для бронирования для каждой книги, а также получаю общее количество записей в книге LOAN, сгруппированных по номеру ISBN.

Из этого результата я немедленно повторно присоединяюсь к резервированиям для сопоставления на основеISBN и временная метка самого раннего, чтобы получить ВОЗ, которую он хотел.

Теперь финал ... ПРИСОЕДИНЯЙТЕСЬ (не СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ) к таблице книг как на ISBN, так и на вашем определителе, сколько доступных копий... меньше того, сколько уже сдано в аренду, составляет> 0.

Очевидно, что вы можете добавить заказ по предложению, как хотите.

УБЕДИТЕСЬ, что у вас есть индекс в таблице резервирований (bookISBN, отметка времени) для оптимизации запросов.Кроме того, таблица ссуд также должна иметь индекс 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...