考虑具有给定字段的tasks
表:
id | release_date | task_number
-------------------------------------
1 | 2012-09-01 | task_number#1
2 | 2012-09-07 | task_number#2
3 | 2012-09-11 | task_number#3
4 | 2012-09-05 | task_number#4
5 | 2012-09-21 | task_number#5
6 | 2012-09-31 | task_number#6
我想检索最接近(之前和之后)给定日期的记录。
我知道这可以通过使用两个单独的查询来完成。
但有没有办法检索single mysql query
中最近的记录?
例如,如果给定日期为2012-09-11
,则输出应为:
id | release_date | task_number
-------------------------------------
2 | 2012-09-07 | task_number#2
3 | 2012-09-11 | task_number#3
5 | 2012-09-21 | task_number#5
答案 0 :(得分:1)
以下应该是我认为的技巧 - 它按顺序使用timeDiff:
select
id,
release_date,
task_number
from
tasks
order by
abs(timediff('2012-09-11',release_date)) desc
您可以使用您在PHP连接中作为参数输入的值,如下所示:
select
id,
release_date,
task_number
from
tasks
order by
abs(timediff(:yourDate,release_date)) desc
并以相同的yyyy-mm-dd
格式将字符串传递给它。
编辑:来自下方的有趣评论,看起来准确无误 - 但是以下应该可以解决这个问题:
select
id,
release_date,
task_number
from
tasks
order by
abs(time_to_sec(timediff('2012-09-11',release_date))) desc
答案 1 :(得分:0)
如果你有release_date索引,你可以这样做以获得更好的性能。
select
id,
release_date,
abs( datediff(release_date,"$the_date") ) as sort_key
from tasks
where
id = (select id from tasks where release_date > "$the_date" order by created_time limit 1)
or
id = (select id from tasks where release_date < "$the_date" order by created_time desc limit 1)
order by sort_key limit 1;
第一个子查询将在$ the_date之后找到第一个日期的ID,第二个子查询将在$ the_date之前找到最后日期的ID,之后,我们可以轻松地选择愿望日期。