Mysql 最后一个期间的SQL选择

Mysql 最后一个期间的SQL选择,mysql,sql,triggers,Mysql,Sql,Triggers,我有一张这样的桌子: IDstatusstart\u日期结束\u日期 1A2015-01-012015-12-31 1B2016-01-01NULL 2016年12月31日星期二 3DNULLNULL 这里有一个稍微简化的查询,它返回的结果集与问题中的查询完全相同。它只使用两个子查询,而不是四个子查询(没有重复的子查询): 注意,它不包括a=NULL和b=NULL的情况。若要将其也包括在内,必须删除最后一条和第条,即: SELECT * FROM My_Table AS T WHERE

我有一张这样的桌子:


IDstatusstart\u日期结束\u日期
1A2015-01-012015-12-31
1B2016-01-01NULL
2016年12月31日星期二
3DNULLNULL

这里有一个稍微简化的查询,它返回的结果集与问题中的查询完全相同。它只使用两个子查询,而不是四个子查询(没有重复的子查询):

注意,它不包括
a=NULL和b=NULL的情况。若要将其也包括在内,必须删除最后一条和第条,即:

SELECT *
FROM My_Table AS T
WHERE 
  (T.start_date Is Null OR T.start_date = (SELECT MAX(start_date) FROM My_Table WHERE ID = T.ID)) AND 
  (T.end_date Is Null OR T.end_date = (SELECT MAX(end_date) FROM My_Table WHERE ID = T.ID)) 
;

这里有一个稍微简化的查询,它返回的结果集与问题中的查询完全相同。它只使用两个子查询,而不是四个子查询(没有重复的子查询):

注意,它不包括
a=NULL和b=NULL的情况。若要将其也包括在内,必须删除最后一条和第条,即:

SELECT *
FROM My_Table AS T
WHERE 
  (T.start_date Is Null OR T.start_date = (SELECT MAX(start_date) FROM My_Table WHERE ID = T.ID)) AND 
  (T.end_date Is Null OR T.end_date = (SELECT MAX(end_date) FROM My_Table WHERE ID = T.ID)) 
;

我会跳过触发器,取而代之的是视图。我会跳过触发器,取而代之的是视图。