【发布时间】:2019-03-30 06:34:22
【问题描述】:
此数据库用于图书借阅系统。如果学生拿了一本书的副本,系统会接受那里的学生编号并给他们一个书的归还日期。这是我正在使用的两个表
贷款表:
CREATE TABLE loan (
`code` INT NOT NULL,
`no` INT NOT NULL,
taken DATE NOT NULL,
due DATE NOT NULL,
`return` DATE NULL,
CONSTRAINT pri_loan PRIMARY KEY (taken),
CONSTRAINT for_loan
FOREIGN KEY (`code`) REFERENCES copy (`code`),
FOREIGN KEY (`no`) REFERENCES student (`no`));
学生桌:
CREATE TABLE student (
`no` INT NOT NULL,
`name` VARCHAR(30) NOT NULL,
school CHAR(3) NOT NULL,
embargo BIT NOT NULL,
CONSTRAINT pri_student PRIMARY KEY (`no`));
首先,我希望计算一本书的最新截止日期(它会显示该书的代码以及该书的最新截止日期) 我使用这段代码完美地完成了这项工作
SELECT `code`, max(due)
FROM loan
GROUP BY `code`
现在我想修改这个查询,让它获取每本书的最新到期日期,但只显示拥有该书的学生编号 (no)。为此,我需要使用一个我对它知之甚少的子查询,因为我才刚刚开始使用 MySQL。基本上我不确定如何创建这个子查询,我想知道是否有人可以帮助我并解释它,而不仅仅是给我看代码。
【问题讨论】:
-
您可以查看一些设计问题 - 我认为 take 不是主键的好候选者,您可以在贷款表。而且您当前的查询没有考虑退货。另外,您如何确定图书馆是否拥有超过 1 本的书籍?
-
你为什么需要 max(due_date) 肯定只是检查 return 为 null 的位置会给你所有那些尚未返回的?
-
基本上这只是一个虚拟数据库,字段名称并不重要,因为我说我只是学习如何使用 MySQL。就书籍而言,每本书不止一本,并且在借阅表中,您可以看到每本书中有多少已被借出(每本书只有几本)我谈论的第一个查询如何获取最新到期的已借出的每本书的日期,例如:(book1 已借给 2001 年的学生,并且它具有最新的到期日期,因此这是要返回的行)我只是想创建一个子查询,因此该表仅显示学生号码
-
我将来会处理的设计问题,我只是想练习 MySQL 数据库可以执行的不同功能。我并不是真的想创建一个合适的数据库,如果我要将它实现到一个实际的库中,它将完美地工作。
-
我添加了greatest-n-per-group 标签。这类问题已经回答过很多次了。按照标签获取示例。
标签: mysql subquery groupwise-maximum