我将创建下表
$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()的抱怨。艾米想法如何只挑选用户提出的一个随机问题。我仍然在开发,所以即使这意味着改变我的桌子,欢迎所有的答案
答案 0 :(得分:0)
如果你没有使用RAND()
因为它需要搜索整个表格(我仍然认为你应该计时,它可能“足够快”);您可以构建一个包含仅未答复问题和用户ID列表的PK表。
第二个查找表应该小于所有可能的问题。然后,您可以从查找表中获取随机主键,并直接从主问题表中选择它。
唯一的问题是你需要保持查找表刷新;这可以是根据您系统的使用模式完成的触发器或计划任务。
您还可以在客户端缓存查找结果,例如SELECT id, userid, answer
,并使用PHP的随机函数从此列表中进行选择。
如果你打算这样做;我建议使用外部缓存,以便多个进程不会从这个未答复的集合中选择相同的问题。
答案 1 :(得分:0)
我可能会使用以下
来解决它计算用户未回答的所有问题,即400,000。可以说count = 400000
在你的脚本中得到1到1之间的随机数,即323875.让我们说随机= 323875
使用随机数作为偏移并限制1,然后您可以获得单个问题记录。