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

时间:2012-08-20 20:17:01

标签: php mysql random

我将创建下表

  $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个问题我在大dbs上看到了一些关于rand()的抱怨。艾米想法如何只挑选用户提出的一个随机问题。我仍然在开发,所以即使这意味着改变我的桌子,欢迎所有的答案

2 个答案:

答案 0 :(得分:0)

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

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

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

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

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

答案 1 :(得分:0)

我可能会使用以下

来解决它

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

在你的脚本中得到1到1之间的随机数,即323875.让我们说随机= 323875

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