希望创建一个仅显示一列 MYSQL 的子查询
Posted
技术标签:
【中文标题】希望创建一个仅显示一列 MYSQL 的子查询【英文标题】:Looking to create a subquery that displays only one column MYSQL 【发布时间】: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 标签。这类问题已经回答过很多次了。按照标签获取示例。 【参考方案1】:您正在寻找的是HAVING
语法:
SELECT
`no` as student
FROM
`loan`
GROUP BY
`code`
HAVING
DATETIME(`due`) = MAX(DATETIME(`due`));
HAVING
允许您向SELECT
语句添加一个条件,该条件引用和过滤可用值(包括选定的列及其最终值,如果您正在进行计算,这将非常方便)。
查看这里了解更多信息:https://www.guru99.com/group-by.html
【讨论】:
感谢您提供真正有用的信息。我能理解你对“有”声明的意思。但是,当我运行此查询时,它没有返回任何结果,您能否告诉我们每个部分都在做什么以帮助我更好地理解它 当然可以。我实际上只是更改了几件事,并且我的语法可能有点不正确(因为没有我相信可以正确运行的 MySQL Fiddle 站点,我实际上无法测试查询以确保它按应有的方式运行)。基本上,对于HAVING
,您需要选择要比较的值,然后在HAVING
调用中引用它。这种事情很大程度上取决于您将子查询放在查询中的确切位置,以及您访问数据的方式。
再次编辑以包含 group by,因为在考虑它时,在这种情况下可能也需要。另外,在最后的HAVING
语句中,我将dueDate 转换为dateTime,以便MySQL 可以更准确地比较这些值(因为它对如何使用带有日期时间信息的数字运算符有点挑剔)。以上是关于希望创建一个仅显示一列 MYSQL 的子查询的主要内容,如果未能解决你的问题,请参考以下文章