在会话中存储随机选择的行?
嗨!
我正在构建一个PHP脚本,从MySQL表中输出一个随机字。每次刷新脚本时,我都想要显示一个新单词。 (它连接到jquery - 所以php文件的数据输出直接显示在我的页面上)
但是,我只想显示每个单词一次。如果选择了所有单词,我希望脚本重置并重新开始拾取。
现在我已经通过设置一个名为“visited”的附加表并将表中所有选中的行放入其中的“wordlist”,并将用户唯一的session-id设置为 防止多个用户的结果相互干扰。
所以查询是这样的:
session_start();
$id = session_id();
$random_sql = "SELECT *
FROM wordlist AS a
LEFT JOIN visited AS b ON a.word = b.word
AND b.sessionid = '$id'
WHERE b.word IS NULL
ORDER BY a.weight * rand( ) DESC // Weighted random
LIMIT 1";
$random_row = mysql_query($random_sql);
if(mysql_num_rows($random_row) > 0)
{
while($row = mysql_fetch_row($random_row))
{
$insert_query = "INSERT INTO visited (ID, word, sessionid, date) VALUES ('$row[0]', '$row[1]', '$id', CURDATE())";
$insert = mysql_query($insert_query) or die (mysql_error());
echo $row[1];
}
这很好用,但我觉得数据库很难同时处理很多访问者?
所以我的问题是:
如何在会话中存储“已访问”字词的信息并将其从查询中排除?
还有一件事:我估计wordlist-table将有大约8000行。对于ORDER BY RAND函数来说,这会是多少,并且渲染速度明显变慢?
谢谢!
答案 0 :(得分:0)
这取决于数据必须持久的程度。如果您不需要持久性,那么会话在这种情况下当然更有效。你可以在那里存储任何PHP数据结构,即我猜你在这种情况下会使用关联数组。
关于性能:如果单词按顺序编制索引,您可以考虑将随机数生成为直接ID,并直接检索特定行。 ORDER BY RAND()
必须生成所有数字并对其进行排序,这比仅生成一个ID RAND() * MAX(ID)
的效率低得多。