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).')";

我的大问题是我需要从这些选定的问题中选择一个随机问题。我的数据库多达 600,000 个问题,我在大型数据库上看到了一些关于 rand() 的投诉。艾米想出如何只选择一个用户尚未回答的随机问题。我仍在开发中,因此欢迎所有回答,即使这意味着要更换我的桌子

4

2 回答 2

0

如果您不使用RAND()它,因为它需要搜索整个表格(我仍然认为您应该计时,它可能“足够快”);您可以构建一个包含未回答问题和用户 ID列表的 PK 表

第二个查找表应该小于所有可能的问题。然后,您可以从查找表中获取随机主键,并直接从主问题表中选择它。

唯一的问题是您需要保持查找表的刷新;这可以是触发器或计划任务,可以根据系统的使用模式完成。

您还可以缓存查找的结果,例如SELECT id, userid, answer在客户端,并使用 PHP 的随机函数从该列表中进行选择。

如果你打算这样做;我建议使用外部缓存,这样多个进程就不会一直从这个未回答的集合中选择同一个问题。

于 2012-08-20T20:23:21.413 回答
0

我可能会使用以下方法解决它

计算用户未回答的所有问题,即 400,000。可以说计数= 400000

在你的脚本中得到一个介于 1 之间的随机数来计数,即 323875。让我们说 random=323875

使用随机数作为偏移量和限制 1,然后您可以获得单个问题记录。

于 2012-08-20T21:21:22.867 回答