Mysql SQL-选择最近的上一个日期

Mysql SQL-选择最近的上一个日期,mysql,sql,Mysql,Sql,我有一个数据库表,其中包含每个患者的一个或多个条目。其中包含自由文本和有关测试请求的附加信息。例如,查询患者将返回:- TestID PatientID RequestMade FreeText 1 23 13/12/2015 11:00:00 Feeling breathless 1125 23 07/04/2016 09:31:15 Unexplained fractu

我有一个数据库表,其中包含每个患者的一个或多个条目。其中包含自由文本和有关测试请求的附加信息。例如,查询患者将返回:-

TestID      PatientID   RequestMade             FreeText
1           23           13/12/2015 11:00:00    Feeling breathless
1125        23           07/04/2016 09:31:15    Unexplained fractures
2556        23           04/12/2016 16:20:21    Check liver function – on statins
查看测试结果时,我必须调出与测试相关的请求信息,这将是测试之前的最后一个请求信息。结果有一个TestDate,因此TestDate为'13/04/2016 14:21:30'应显示'07/04/2016 09:31:15'的请求。我不确定如何有效地编码,因为返回患者的每个条目并对每个条目进行日期比较似乎不是解决此问题的最佳方法。

如果您希望在对单个患者进行另一项测试之前先进行一项测试,并且您要查找的测试只显示一次,则可以通过以下单个查询执行此操作:

select t.*
from tests t
where t.patientid = 23 and
      t.requestmade < (select t2.requestmade
                       from tests t2
                       where t2.patientid = t.patientid and
                             t2.testid = ?
                      )
order by t.requestmade desc
limit 1;
如果您希望对单个患者先进行一项测试,然后再进行另一项测试,并且您要查找的测试只显示一次,则可以通过以下单个查询执行此操作:

select t.*
from tests t
where t.patientid = 23 and
      t.requestmade < (select t2.requestmade
                       from tests t2
                       where t2.patientid = t.patientid and
                             t2.testid = ?
                      )
order by t.requestmade desc
limit 1;

请编辑您的问题并显示您当前的查询。使用日期数据类型存储日期,然后查看并返回给我们。您还没有考虑设置操作。我强烈建议你改变这种模式。SQL是一种声明性语言。1您的查询描述了所需的数据。2 RDBMS检索数据。3如果您有正确的索引,它将尽可能高效。请编辑您的问题并显示您当前的查询。使用日期数据类型存储日期,然后查看并返回给我们。您还没有考虑设置操作。我强烈建议你改变这种模式。SQL是一种声明性语言。1您的查询描述了所需的数据。2 RDBMS检索数据。3如果您有正确的索引,它将尽可能高效。