PostgreSQL查询图书馆管理系统

时间:2019-02-06 11:31:47

标签: sql postgresql

获取无法再向其发行图书的会员ID和会员名称,因为他们已经发行的图书数量与有权获得的图书数量一样

以下是架构:

Book_Records(accession_no,isbn_no)
Book(isbn_no, author, publisher, price)
Members(member_id, member_name,max_no_books,max_no_days)
Book_Issue(member_id,accession_no,issue_date,return_date)
CREATE TABLE BOOK (ISBN_NO VARCHAR(35) PRIMARY KEY, 
                   AUTHOR VARCHAR(35) NOT NULL,
                   PUBLISHER VARCHAR(35) NOT NULL, 
                   PRICE NUMERIC(10,3));
CREATE TABLE BOOK_RECORDS(ACCESSION_NO VARCHAR(35) PRIMARY KEY, 
              ISBN_NO VARCHAR(35) REFERENCES BOOK(ISBN_NO));
CREATE TABLE MEMBERS(MEMBER_ID VARCHAR(35) PRIMARY KEY,
             MEMBER_NAME VARCHAR(35) NOT NULL,
             MAX_NO_BOOKS INT,
             MAX_NO_DAYS INT);
CREATE TABLE BOOK_ISSUE(MEMBER_ID VARCHAR(35) REFERENCES MEMBERS(MEMBER_ID),
                        ACCESSION_NO VARCHAR(35) REFERENCES 
                        BOOK_RECORDS(ACCESSION_NO),
                        ISSUE_DATE DATE NOT NULL,
                        RETURN_DATE DATE,
                        PRIMARY KEY(MEMBER_ID,ACCESSION_NO));

我尝试了以下查询,但失败了。

SELECT DISTINCT member_name 
FROM members AS m 
  JOIN ( 
    SELECT member_id, COUNT(*) AS no_books_issued 
    FROM book_issue 
    GROUP BY member_id,accesion_no 
    HAVING no_books_issued >= max_no_books
  ) AS b ON m.member_id = b.member_id;

1 个答案:

答案 0 :(得分:0)

大概是这样的查询获取当前已发行的图书数量:

SELECT member_id, COUNT(*) AS num_books
FROM book_issue 
WHERE return_date IS NULL
GROUP BY member_id;

我对最大图书数量的理解是同时发生的-也就是说,仅统计未归还的图书。也许您有不同的定义。

然后,您可以在JOIN中使用它,对子查询的最大外部进行比较:

SELECT member_name 
FROM members m JOIN
    (SELECT member_id, COUNT(*) AS num_books 
     FROM book_issue 
     WHERE return_date IS NULL
     GROUP BY member_id
    ) b
    ON b.member_id = m.member_id AND
       b.num_books >= m.max_no_books;

注意:

  • JOIN中,与外部表的比较需要在子查询的外部
  • 不需要SELECT DISTINCT
  • 用于计数图书的GROUP BY应该仅在会员级别。