2012-03-21 2 views
1

대출, 예약 및 도서 테이블이 3 개 있습니다. books 테이블에는 "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

이것은 MySQL입니다. (다른 어떤 것도'GROUP BY'에'SELECT' cols를 허용하지 않습니다.) –

+0

예 MySQL, 죄송합니다 – Raiden616

+1

대출을 끝내고 다음 사람에게 주어 졌을 때 대출 및 예약의 기록 상태는 어떻게됩니까? . 완료했다고 말하는 깃발이 있습니까? 예약 테이블 (또는 대출 테이블)에서 제거됩니까? – DRapp

답변

0

.

저는 사람들이 예약 한 책을보고 목록을 시작합니다. 왜 아무도 자신에게 관심이없는 책의 질의와 전체 목록 ... 그렇다면 기준을 확장하십시오. 내부 조회는 예약 목록에있는 책으로 직접 시작됩니다. 그것은 대출 테이블에 LEFT JOINED됩니다 (대출이 남아 있지 않은 경우). 책 당 예약에 대해 가장 오래된 시간 스탬프를 추출하고 ISBN으로 그룹화 된 대출 도서 항목의 총 수를 얻습니다.

그 결과로, 나는 즉시 ISBN과 가장 빠른 것의 타임 스탬프에 기초하여 일치시킬 예약에 다시 가입하여 WHO가 원했던 것을 얻습니다.

이제 피날레 ... 이미 빌려 준다 적은 몇 사용할 수 복사본 ... 수가 있다는 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