2009-08-26 4 views
0

日付値の間の行を取得:MySQLは、日付に関係なく、私は次のクエリを実行し、すべての行が返さ取得しています

SELECT DISTINCT p.name, p.category, u.f_name, t.name 
FROM (
     prizes p, tags t, results r 
     ) 
LEFT JOIN 
     users u 
ON  (r.user_id = u.id) 
LEFT JOIN 
     f_tag_lookup tl 
ON  (tl.tag_id = t.id) 
WHERE r.tag_id = t.id 
     AND r.date BETWEEN concat(date_format(LAST_DAY(now() - interval 1 month), '%Y-%m-'),'01') AND last_day(NOW() - INTERVAL 1 MONTH) 

r.dateは、日時フィールドです。先月の日付は3行、今月の日付は3行ですが、すべての行が戻ってきていますか?

任意のポインタがありがとう。先月の最初と最後の日、つまり7月のすべての検索結果を返信したいと思います。

おかげで、

答えて

0

となっています。日付に関するSQLは問題ありませんでしたが、JOINSは間違っていました。返信をありがとう。

3

あなただけの月()日付関数を使用することができませんでしたか?

月(日付)=月(今())をフィルタとして使用します。

年以上のデータがある場合は、year(date)= year(now())も一致する必要があります。

私はパフォーマンスについてはわかりませんが、私にはそれをそのように表現する方が読みやすいようです。

SELECT DISTINCT p.name, p.category, u.f_name, t.name 
FROM (prizes p, tags t, results r) 
LEFT JOIN users u ON (r.user_id = u.id) 
LEFT JOIN f_tag_lookup tl ON (tl.tag_id = t.id) 
WHERE r.tag_id = t.id AND 
     month(r.date) = month(now()) AND 
     year(r.date) = year(now()) 
+0

月(r.date)= 07と年(r.date)= 2009年はr.dateよりパフォーマンスが悪くないことがありますBETWEEN concat(date_format(LAST_DAY(now-)-interval 1 month)、 '%Y - %m - ')、' 01 ')AND last_day(NOW() - INTERVAL 1 MONTH) –

+0

おそらくそうではありませんが、一定のuper boundに対する演算子間の使用はインデックス化された選択の方が最適です。 – cms

+0

だから私は前の月の月(今() - 1ヶ月の間隔)をしますか? – codecowboy

関連する問題