2017-01-30 12 views
0

1行statusは "OK"、 "PI"、 "CBK"、 "NRP"、 "NEW")を選択する必要があります。 」、(status_time + 86400)クエリの実行時に、ステータスが過去にすでにあるstatus_time + 86400秒を持っている必要がありますように、現在のタイムスタンプであるSMALLER NOW よりこれでなければならず、クエリに記述されているようにします。条件付きのmySQLで時差を計算する

SELECT id FROM leads t JOIN (
    SELECT "OKQ" as status, 86400 as diff UNION ALL 
    SELECT "PI" as status, 3600 as diff UNION ALL 
    SELECT "CBK" as status, 60 as diff UNION ALL 
    SELECT "NRP" as status, 3600 as diff UNION ALL 
    SELECT "NEW" as status, 1 as diff 
) s USING (status) 
WHERE t.status_time > date_sub(now(), interval s.diff second) 
ORDER BY RAND() 
LIMIT 1 

Nowこのクエリは、「NEW」のレコードの大半を持っていても0num_rowsとして返します。NOW(現在のタイムスタンプ)は4日前+ 1秒よりはるかに大きいので、1行は必須です選択される。

+1

私はあなたが '>'ではなく '<'を望むと思います。 –

答えて

1

あなたのクエリは、あなたがtはステータスとしてのdiff UNIONなどのステータス、86400としてALL SELECT "PI" を( SELECT "OKQを" JOINのリードから<の代わりに、>

SELECT IDを使用する必要があり、以下のようになります。 3600差分UNIONとしてALL )差分状態としてUNION ALL SELECT "NEW"、1差分 )を用いたSと(状態として、ステータスとして、ステータスとして3600を差分UNION ALL SELECT "NRP" として60 "CBK" を選択 WHERE t.status_time < date_sub(now()、interval s.diff second) ORDER BY RAND() LIM IT 1