0

情報がすべてMySQLデータベースに保存されている200の更新を含むアーカイブWebサイトがあります。

ウェブサイトに固定数、たとえば52を表示したいのですが、毎週、合計数を52に保ちながら、1つずつ回転させて1つずつ回転させます。

これはデータベースの更新の問題ではなく、その情報は修正されています。これは、データベース52からの更新の「ラウンドロビン」をWebサイト自体に一度に表示することです。私は質問を理解しようと頭を悩ませています。

私が思いついたものは何も意味がないので、まだ何も試していません。

私が自分の頭の中で調査して解決したことから、開始日と終了日として情報をDBテーブルにハードコーディングすることは、(私にとって)ばかげた方法です。この更新の数は固定されており、毎週金曜日など、一度に52を永遠に表示するようにしたいだけです。

PHP 5.3.20を実行している専用サーバーがあり、MySQL / MySQLiは5.5.27です(MySQLiでコーディングしています)。

どこを見ても、どれだけ本を調べても、この問題に対する答えは見つかりません。どんな助けでも喜んでいただければ幸いです!

4

3 に答える 3

2

特定の日付からの週数を計算する関数を作成し、それからデータベースクエリにオフセットを追加しようとします。

<?php

  $starttime = strtotime("28 December 2012"); // a recent Friday
  $week = 7 * 24 * 60 * 60; // time value of a week
  $posts = 200; // number of posts in your db
  $limit = 52; // number of shown posts
  $offset = floor((time()-$starttime)/$week); // rounds down difference in weeks from startdate until now
  while ($offset>$posts-$limit) $offset = $offset - ($posts-$limit); 
  // this will make the cycle start over when you have reached the end (ie offset 148)...

  ?>

次に、クエリでオフセットと制限の戻り値を使用します。

  'SELECT ... LIMIT '.$offset.','.$limit;
于 2013-01-01T02:33:39.260 に答える
1

わかりました。これは難しい問題です。mysql5.5.6を使用している場合は、実際にユーザー変数を直接割り当ててこれを行うことができます。

SET @week_nr = WEEK(NOW());

そして、これを行います:

SELECT * FROM updates LIMIT 52 OFFSET @week_nr;

それは今週の第0週になります。

しかし、2005年以降、このバグが原因で、それは下位バージョンでは機能しません...

プリペアドステートメントを使用してmysqlフォーラムで見られるように、他のmysqlのこの制限を回避する方法があります。ただし、そのクエリは毎週1ずつオフセットされます。

jthemanのソリューションに相当するものは次のようになります。

   SET @offset = FLOOR(UNIX_TIMESTAMP() - (WEEK("2012-12-28") 
                 / ( 7 * 24 * 60 * 60))); 

しかし、ここで見ることができるように、DateTimeには、使用できる別の関数があります。

SET @week_nr = YEARWEEK(NOW());

そしてそれは年の証拠です。

于 2013-01-01T02:19:32.793 に答える
0

データベースの行をマークする時間と自動インクリメントは、この問題であなたの友達になります。SQLを毎週金曜日に実行する場合は、cronジョブを設定する必要があります。

SQLの場合、DESCで行を選択し、その数を52に制限するか、タイムスタンプを使用して最新の行を取得します。

于 2013-01-01T02:07:49.077 に答える