0

次のテーブルを作成します

  $sql[] = "CREATE TABLE IF NOT EXISTS #__GmQuestions(
  QnID int(11) NOT NULL AUTO_INCREMENT,
  Question text COLLATE utf8_unicode_ci NOT NULL,
  Answer text COLLATE utf8_unicode_ci NOT NULL,
  QnLevel int(11) NOT NULL,
  QnPrize text COLLATE utf8_unicode_ci,
  QnPoints  DECIMAL( 10, 2 ) NOT NULL,
  PRIMARY KEY (QnID),

)";

および次の表

 $sql[] = "CREATE TABLE IF NOT EXISTS #__GmHistory(
  HsID int(11) NOT NULL AUTO_INCREMENT,
  HsGamerID int(11) NOT NULL,
  HsQnID int(11) NOT NULL,
  Hspoints  DECIMAL( 10, 2 ) NOT NULL,
  HsAnswer varchar(55) COLLATE utf8_unicode_ci NOT NULL,
  HsStatus varchar(55) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'Pending',
  HsDateCreated timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  HsPrize varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (HsID)
)";

レベル列には 1 ~ 10 の整数が含まれます。Qnlevel=1 の質問からランダムな質問を選択したいのですが、この質問は以前にユーザーによって回答されていてはなりません。だから私はこのクエリを持っています

//SELECT GAMERS question HISTORY
$result = mysql_query("SELECT HsQnID FROM #__QnHistory WHERE HsGamerID LIKE GamerID");
$Answeredquestions = Array();
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    $Answeredquestions[] =  $row['QnID'];  
}
// I now select questions making sure the user hasent anweres them  
$query="SELECT * FROM #__GmQuestions WHERE QnLevel = 1 AND QnID NOT IN ('.implode(',', $Answeredquestions).')";

私の大きな問題は、これらの選択された質問から 1 つのランダムな質問を選択する必要があることです。私のデータベースは最大 600,000 の質問があります。大きなデータベースでの rand() についていくつかの不満を見てきました。エイミーは、ユーザーがまだ回答していないランダムな質問を 1 つだけ選択する方法を考えています。私はまだ開発中なので、テーブルを変更することを意味する場合でも、すべての回答を歓迎します

4

2 に答える 2

0

私はおそらく次を使用してそれを解決するでしょう

ユーザーが未回答のすべての質問、つまり 400,000 の数を取得します。count=400000 としましょう

スクリプトで、1 から 323875 までの乱数を取得します。random=323875 としましょう

乱数をオフセットおよび制限 1 として使用すると、単一の質問レコードを取得できます。

于 2012-08-20T21:21:22.867 に答える
0

テーブル全体を検索する必要があるために使用していない場合RAND()(それでも時間を計る必要があると思いますが、「十分に速い」可能性があります); 未回答の質問とユーザー IDのみのリストを含む PK のテーブルを作成できます。

この 2 番目のルックアップ テーブルは、考えられるすべての質問よりも小さくする必要があります。その後、ルックアップ テーブルからランダムな主キーを取得し、それをメインの質問テーブルから直接選択できます。

これに関する唯一の問題は、ルックアップ テーブルを最新の状態に保つ必要があることです。これは、システムの使用パターンに従って実行できるトリガーまたはスケジュールされたタスクです。

SELECT id, userid, answerクライアント側などでルックアップの結果をキャッシュし、PHP のランダム関数を使用してこのリストから選択することもできます。

これを行う場合; 複数のプロセスがこの未回答のセットから同じ質問を選び続けないように、外部キャッシュを使用することをお勧めします。

于 2012-08-20T20:23:21.413 に答える