3

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

特定の日付に最も近い(前後の)レコードを取得したいと思います。

これは、2つの別々のクエリを使用して実行できることを私は知っています。

しかし、?で最も近いレコードを取得する方法はあります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
4

2 に答える 2

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
于 2012-09-25T09:27:50.170 に答える
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を見つけ、2番目のサブクエリは$ the_dateの前の最後の日付のIDを見つけます。その後、希望の日付を簡単に選択できます。

于 2012-09-25T09:57:26.053 に答える