MySQL 查询仅获取一条记录:当 end_date 为 null 或 max(end_date) 时

Posted

技术标签:

【中文标题】MySQL 查询仅获取一条记录:当 end_date 为 null 或 max(end_date) 时【英文标题】:MySQL query to get only one record: either when end_date is null or max(end_date) 【发布时间】:2022-01-15 03:22:30 【问题描述】:

我有下表 (employee_organization):

ID employee_id organization_id start_date end_date
1 77 16 2021-01-01 2021-06-30
2 11 23 2020-01-01 2021-05-27
3 77 16 2021-08-01 2021-08-31
4 77 16 2021-09-01 NULL

我需要一个查询来过滤掉employee_id = 77organization_id = 16end_date is null 的记录。如果没有找到匹配的行,则返回带有max(end_date) 的行。因此,在上面的示例表中,应该只返回带有id=4 的行。

【问题讨论】:

到目前为止你尝试过什么?如果这些情况都不匹配 max 也可以是这些值中的任何一个? 我已经更新了示例表...如果行 ID=4 不存在,我希望结果行 ID=3。我希望这会有所帮助。 【参考方案1】:
SELECT *
FROM table
WHERE needed conditions
ORDER BY end_date IS NULL DESC, end_date DESC LIMIT 1

【讨论】:

【参考方案2】:

一个通用的解决方案是使用相关子查询来查找每个员工的最大日期(空值优先):

select *
from t
where end_date <=> (
  select end_date
  from t as x
  where x.employee_id = t.employee_id
  order by end_date IS NOT NULL, end_date desc
  limit 1
)

【讨论】:

以上是关于MySQL 查询仅获取一条记录:当 end_date 为 null 或 max(end_date) 时的主要内容,如果未能解决你的问题,请参考以下文章

如何使用聚合函数在 MySQL 查询中获取分组记录的第一条和最后一条记录?

如何使用聚合函数在 MySQL 查询中获取分组记录的第一条和最后一条记录?

mysql中如何查询表的第一条和最后一条记录

mysql 查询时间范围内的数据该怎么写select语句,如果结束时间为空则不判断结束时间

如何正确总结datetime(end_date和begin date之间的区别) - mysql

如何获取mysql重复项中的最后一条数据