2012-02-14 20 views
1

私は前の7日間のそれぞれから最後のレコードを選択するMySQLクエリを考え出しています。過去7日間のうち1日にデータが欠落していると、私は6レコードしか戻ってこないでしょう。ここで私が持っているものです。MySQL過去7日間の最後のレコードを選択するクエリ

SELECT tracking.* FROM tracking 
INNER JOIN 
    (SELECT MAX(lastChecked) AS maxLastChecked, id FROM tracking 
    WHERE lastChecked >= DATE_SUB(lastChecked, INTERVAL 7 DAY) 
     GROUP BY DAY(lastChecked)) as Lookup ON Lookup.id = tracking.id 
      WHERE tracking.propertyID = 1 ORDER BY tracking.lastChecked ASC LIMIT 7 

基本的にこれが何をすべきか(今日から始まる)過去7日間のそれぞれのトラッキングテーブルでpropertyID = 1の最終的な記録のエントリを選択しています。しかし、このクエリは(過去7日間以内にレコードのみよりも)私にこれを返して:

ID propertyID lastChecked    value 
2  1   2012-01-25 05:30:00  280 
1  1   2012-01-26 12:34:02  268 
5  1   2012-01-27 09:51:31  268 
83 1   2012-02-13 00:01:07  276 

これを修正するための任意の助けいただければ幸いです!

+0

確認...「ID」列の自動インクリメントの主キー、及び2です。 .. LastCheckedは、いつ追加され、ID83を作成する誰かが修正することができず、ID84よりも前の時刻に対応するか、またはそれに類するものですか?また、lastchecked列にインデックスがありますか? – DRapp

答えて

0

に置き換えます

SELECT tracking.* FROM tracking 
INNER JOIN 
    (SELECT MAX(lastChecked) AS maxLastChecked, id FROM tracking 
    WHERE DATEDIFF(lastChecked,NOW())<=7 
     GROUP BY DAY(lastChecked)) as Lookup ON Lookup.id = tracking.id 
      WHERE tracking.propertyID = 1 ORDER BY tracking.lastChecked ASC 
0

私はあなたがこの部分に代わり「lastChecked」のシステム日付を持つべきであると信じて:

DATE_SUB(lastChecked, INTERVAL 7 DAY) 

は次のようになります。

DATE_SUB(SYSDATE(), INTERVAL 7 DAY) 
0
WHERE lastChecked >= DATE_SUB(lastChecked, INTERVAL 7 DAY) 

あなたのコードのこの条件はあることを行っていますlastCheckedは常にlastChecked -7より大きいため、すべてのレコードでtrueです。 だから、あなたが必要な場合は、最後の7日間のデータがこの文字列で検索してください

WHERE lastChecked >= DATE_SUB(SYSDATE(), INTERVAL 7 DAY) 
関連する問題