Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-使用与DATE_ADD和DATE_SUB合并以获取下一条/上一条记录_Mysql_Sql_Coalesce - Fatal编程技术网

MySQL-使用与DATE_ADD和DATE_SUB合并以获取下一条/上一条记录

MySQL-使用与DATE_ADD和DATE_SUB合并以获取下一条/上一条记录,mysql,sql,coalesce,Mysql,Sql,Coalesce,我试图通过查询MySQL来选择上一条记录和下一条记录。我需要帮助一起使用COALESCE和DATE\u ADD/DATE\u SUB SELECT * from `Historical` where `DeltaH` = 'ALTF' and `Date`= COALESCE(DATE_SUB('2019-01-21', INTERVAL 1 DAY), DATE_SUB('2019-01-21',INTERVAL 2 DAY), DATE_SUB('2019-01-21', INTERVAL

我试图通过查询MySQL来选择上一条记录和下一条记录。我需要帮助一起使用COALESCE和DATE\u ADD/DATE\u SUB

SELECT * from `Historical` where `DeltaH` = 'ALTF' and `Date`= 
COALESCE(DATE_SUB('2019-01-21', INTERVAL 1 DAY),
DATE_SUB('2019-01-21',INTERVAL 2 DAY),
DATE_SUB('2019-01-21', INTERVAL 3 DAY));  
我无法使用主键,因为表中的行正在/将要删除。date列也不一定有固定的日期,我想找到的是下一个更早/更晚的日期

SELECT * from `Historical` where `DeltaH` = 'ALTF' and `Date`=  
DATE_SUB('2019-01-21', INTERVAL 3 DAY);
上面的查询似乎有效,但是我需要查询间隔1天,如果日期不存在,请移动到间隔2天

 select * from `Historical` where `DeltaH` = 'ALTF' and `Date`= 
 DATE_SUB('2019-01-21', INTERVAL COALESCE(1,2,3,4,5) DAY);
这个也不行。我知道COALESCE函数返回第一个非null值,但是我无法使用上面的查询使其工作。我已确认2019-01-18的数据存在,但未被选择。你能给个建议吗


我同意使用替代解决方案

您可以使用子查询查找表中小于2019-01-21的最近日期,例如


您可以使用子查询查找表中小于2019-01-21的最近日期,例如


FWIW,我会用不同的方式写这个

SELECT x.* 
  FROM Historical
  JOIN
     ( SELECT deltah
            , MAX(date) date
         FROM Historical
        WHERE date < '2019-01-21'
        GROUP 
           BY deltah
     ) y
    ON y.deltah = x.deltah
   AND y.date = x.date
 WHERE x.deltah = 'ALTF';

FWIW,我会用不同的方式写这个

SELECT x.* 
  FROM Historical
  JOIN
     ( SELECT deltah
            , MAX(date) date
         FROM Historical
        WHERE date < '2019-01-21'
        GROUP 
           BY deltah
     ) y
    ON y.deltah = x.deltah
   AND y.date = x.date
 WHERE x.deltah = 'ALTF';

这似乎是最简单的方法:

select h.*
from historical h
where h.DeltaH = 'ALTF' and
      h2.Date < '2019-01-21'
order by h.Date DESC
limit 1

我不确定一个或两个比较是否应为have=,因此您可以在该日期获得结果。

这似乎是最简单的方法:

select h.*
from historical h
where h.DeltaH = 'ALTF' and
      h2.Date < '2019-01-21'
order by h.Date DESC
limit 1

我不确定一个或两个比较是否应该是have=,这样你就可以在那个日期得到结果。

草莓,你认为这会比Nick建议的快吗?@quark我想很容易找到谢谢。我刚刚开始,我的测试表只有几百行,所以我现在还不能确定,但是我希望表最终会增长到100-200万条记录。构建一个大型测试表非常容易。草莓,你认为这会比尼克建议的更快吗?@quark我想很容易找到谢谢。我刚刚开始,我的测试表只有几百行,所以我现在还不能确定,但是我希望表最终会增长到100-200万条记录。构建大型测试表非常容易。谢谢Gordon。我正在使用select查询更新另一个表,尝试使用your和Nick的查询,两者的性能大致相同~180秒。我有DeltaH的索引,Date。好奇的是,有没有其他/最佳的方法可以更快地完成这项工作?@Quark。这个答案明确指出了DeltaH,Date上的复合索引,而不是多个索引。抱歉,我应该提到我在DeltaH,Date上有一个复合索引。谢谢Gordon。我正在使用select查询更新另一个表,尝试使用your和Nick的查询,两者的性能大致相同~180秒。我有DeltaH的索引,Date。好奇的是,有没有其他/最佳的方法可以更快地完成这项工作?@Quark。这个答案明确说明了在DeltaH,Date上有一个复合索引,而不是多个索引。抱歉,我应该提到我在DeltaH,Date上有一个复合索引。
(select h.*
 from historical h
 where h.DeltaH = 'ALTF' and
       h2.Date < '2019-01-21'
 order by h.Date desc
 limit 1
) union all
(select h.*
 from historical h
 where h.DeltaH = 'ALTF' and
       h2.Date > '2019-01-21'
 order by h.Date asc
 limit 1
);