我有一个名为"booking"的php/mysql数据库表:

hotelNo | guestNo | dateFrom | dateTo | roomNo
   1         1     2022-03-10 2022-03-17  1   
   1         2     2019-07-01 2019-07-08  1
   4         3     2022-03-01 2022-03-09  6
   4         5     2022-07-15 2022-07-25  7
   5         6     2022-03-20 2022-03-29  10
   5         7     1987-03-10 1987-03-21  12

我的任务是 Select 所有最近一次预订超过两年的房间.

SELECT roomNo, dateTo FROM booking
WHERE Year(CURRENT_DATE)-2 > year(dateTo);

结果是:

roomNo | dateTo
  1    2019-07-08
  12   1987-03-21

然而,这是不正确的.1号房间的预订时间为2022-03-10,因此不应出现在结果上.我应该在我的查询中实现什么,以便它首先过滤掉旧的预订,然后判断该房间的最新预订是否在两年前结束?

到目前为止,我try 在查询中使用DISTINCT和ORDER BY子句,但对我不起作用.

推荐答案

你可以把你的条件写在having条款中:

select roomNo, max(dateTo) as dateTo
from booking
group by roomNo
having Year(CURRENT_DATE) - 2 > year(max(dateTo));

Fiddle

Mysql相关问答推荐

MySQL连接序列

MySQL::JSON列的添加使SELECT查询非性能(当需要临时表时)

MySQL Group by或Distinct in Window函数

如何确保 SQL 记录的列不引用它自己的主键?

MySQL 8.0 可以在 Select 语句中返回 JSON 对象数组吗?

将 Go var 传递给 MySQL - try 在 Go lang 程序 (MySQL db) 中执行 db.Exec 时出错

Mysql Pivot 查询/建议

MySQL 根据另一列中的值更改空值

有没有更好的方法在无限滚动的网页上呈现获取的提要数据?

动态创建内联 SQL 表(用于排除左连接)

避免重复进入mysql数据库的最佳方法

MySQL使用多列 Select 重复记录

授予用户对 MySQL 中有限数量表的访问权限

MySQL:在 Select 语句中自动增加临时列

我应该使用什么列数据类型来存储大量文本或 html

MySQL 在每个唯一值第一次出现时 Select 行

在 Yii2 中执行原始 SQL 查询?

启用 NO_BACKSLASH_ESCAPES 选项时如何转义文字百分号?

按 15 分钟间隔对 mysql 查询进行分组

将 UTF8 表上的 latin1 字符转换为 UTF8