1


0

MySQL:特定の期間続くランダムな選択?

はい…​ 私は迷っている(もう一度)。 特定の期間(10分、1時間、1日など)データベースからピックを保持するrand()のカスタムシードを作成するにはどうすればよいですか。

私はこれを使います。

$query = 'SELECT * FROM table order by rand () LIMIT 1';

ページを更新するたびにランダムに選択するため。 何日も読んでいますが、特定の期間選択を維持するカスタムシードを作成する方法を説明する例が見つかりません。 私を助けてください…​ ため息

7 Answer


1


一時テーブルを作成できます:

SELECT * INTO #temp FROM table ORDER BY rand() LIMIT 1

次に、一時テーブルをクエリしてデータを表示します。 タイムアウト後にテーブルを削除または再作成します。


1


PHPを使用している場合は、乱数を生成するアルゴリズムを作成して(rand()を使用)、データベースまたはファイルのどこかにこの番号を保存できます。 次に、現在の日付と乱数の生成日を確認します。 差を計算し、ifステートメントを使用して、乱数を再度生成するときかどうかを判断します。 次に、いくつかの擬似コードを示します(日付はタイムスタンプまたはUnix時間を意味することに注意してください)。

$gendate = getGenerationDateFromDB();
$now = getCurrentDate()
if(getDifference($gendate, $now) > [time interval]) then
  $randnum = generateRandNumber();
  saveRandNumberInDB($randnum);
  saveGenDate();
else
  $randnum = getRandNumberFromDB();


1


私は概念のアイデアを持っていますが、正式な解決策はありません:

切り捨てられた「UNIX_TIMESTAMP()/ 60」で「md5()」を使用します。 テーブルには多数のレコードがあり、Xとします。 `md5()`から数値を計算し、Yとします。 `Y%X`を計算し、Zとします。 SQLの最後に「limit 1 offset Z」を使用します。


1


ドミニク・ロジャーが言ったように、ランドによる注文は恐ろしい。 しかし、cronを使用するのは仕事には大きすぎると思います。 (特に、あなたはその方法がわからない)

むしろ、PHPでランダムな整数を生成して保存し、mysqlにそのようなものに渡す必要があります。

SELECT * FROM table WHERE id=(MOD('.$php_generated_random.', LAST_INSERT_ID())+1)

テーブルの長さを超えないように、大きな乱数を取得してモジュロを行います。

ただし、これには `LAST_INSERT_ID()`に問題があります。 多くの場合、mysqlは0を返します。

したがって、それを行う* good’n’safeの方法*は次のようになります。

  1. 新しいランダムを生成する時間かどうかを確認します

  2. その場合、テーブルから最大IDを取得します(そのテーブルの長さを想定しています) 時々変わる)

  3. IDになる乱数を生成します

  4. IDと生成時間を保存します

id = $ sthの場所のみを選択してください


0


選択したら、そのデータをセッションに保存する必要があり、指定した時間にセッションを設定できます。 毎回データベースに照会する必要はありません。 また、クエリは、指定された時間の広告/時間の設定とは関係ありません。


0


`ORDER BY RAND()`は本当に悪い考えです-データベースのパフォーマンスを低下させます。

これは、「ランダムピック」を長続きさせ、分/時間/日のランダムピックである行のIDを保存する頻度で、cronジョブで実行する必要のあるものです。 ただし、その行が削除されないように注意する必要があります。


0


「カスタムシードを作成する」

私は質問があなたにこのようなことをしたいと思っていると信じています:

$query = 'SELECT * FROM table order by rand (' . get_seed() . ') LIMIT 1';

「シード」の目的は、テスト目的で同じランダムシーケンスを作成することです。

`RAND(N)`定数整数引数Nが指定されている場合、それはシード値として使用され、列値の反復可能なシーケンスを生成します。