PostgreSQL的查询图书馆管理系统

问题描述 投票:0回答:1

找对谁都没更多的书可以发出成员的会员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;
sql postgresql
1个回答
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应该只有在成员级别。
© www.soinside.com 2019 - 2024. All rights reserved.