0

このようなテーブルがあります

id | date | content
1  | 09-16-2013 | content 1 here
2  | 09-23-2013 | content 2 here 
3  | 09-30-2013 | content 3 here

その日から1週間分のコンテンツを表示したいと考えています。たとえば、最初のコンテンツは 2013 年 9 月 16 日に開始し、2013 年 9 月 22 日の深夜まで表示する必要があります。次の日にはコンテンツ2に変わります。同じように、コンテンツ2にいるときは、「前の週のコンテンツ」のように表示してから、前のコンテンツだけを表示したい..現在の日付と、それより下の日付を表示する必要があります。

私はこの種の mysql クエリがあまり得意ではありません。アドバイスをお願いします!

よろしく

4

6 に答える 6

1

私はあなたがこのようなものを探していると思います

SELECT * 
  FROM table1
 WHERE date BETWEEN CURDATE() + INTERVAL 0 - WEEKDAY(CURDATE()) DAY
                AND CURDATE() + INTERVAL 6 - WEEKDAY(CURDATE()) DAY

このクエリは、date列が現在の暦週 (月曜日から日曜日まで) の境界内にある行を取得します。

WEEKDAY()関数 は、日付 (0 = 月曜日、1 = 火曜日、… 6 = 日曜日) の平日のインデックスを返します。表現

CURDATE() + INTERVAL 0 - WEEKDAY(CURDATE()) DAY

現在の暦週の月曜日の日付を返し、

CURDATE() + INTERVAL 6 - WEEKDAY(CURDATE()) DAY

現在の暦週の日曜日の日付を返します。BETWEENinWHERE句を使用するdateと、これら 2 つの日付 (月曜から日曜) の間にある値を持つ行のみがクエリで返されるようになります。

注:date列にインデックスがあることを確認してください。このクエリはインデックスに適しています。

今日の日付 (2013 年 9 月 19 日) の出力例:

+-----+------------+----------------+
| | ID | 日付 | コンテンツ |
+-----+------------+----------------+
| | 1 | 2013-09-16 | コンテンツ 1 ここに |
+-----+------------+----------------+

更新:前の暦週のレコードを取得するには、両方の値から 1 週間の間隔を差し引くだけです。BETWEEN

SELECT * 
  FROM table1
 WHERE date 
   BETWEEN CURDATE() + INTERVAL 0 - WEEKDAY(CURDATE()) DAY - INTERVAL 1 WEEK,
       AND CURDATE() + INTERVAL 6 - WEEKDAY(CURDATE()) DAY - INTERVAL 1 WEEK
于 2013-09-19T19:10:45.077 に答える