我想选择一组指定的行,然后从中随机选择一行


I want to select a specified set of rows then pick one random row out of those

我将创建下表

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

我最大的问题是,我需要从这些选择的问题中随机选择一个问题。我的数据库有60万个问题,我在大型数据库上看到了一些关于rand()的投诉。Amy想出了如何只选择一个用户尚未回答的随机问题。我仍在开发中,因此欢迎所有的Anwer,即使这意味着要更改我的表

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

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

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

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

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

我可能会使用以下来解决它

统计用户未回答的所有问题,即400000。假设计数=400000

在你的脚本中,得到一个介于1之间的随机数来计数,即323875。假设随机=323875

使用随机数作为偏移和限制1,您可以得到一个单一的问题记录。