在会话中存储随机选择的行?

时间:2011-07-24 23:35:31

标签: php jquery mysql sql

在会话中存储随机选择的行?

嗨!

我正在构建一个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函数来说,这会是多少,并且渲染速度明显变慢?

谢谢!

1 个答案:

答案 0 :(得分:0)

这取决于数据必须持久的程度。如果您不需要持久性,那么会话在这种情况下当然更有效。你可以在那里存储任何PHP数据结构,即我猜你在这种情况下会使用关联数组。

关于性能:如果单词按顺序编制索引,您可以考虑将随机数生成为直接ID,并直接检索特定行。 ORDER BY RAND()必须生成所有数字并对其进行排序,这比仅生成一个ID RAND() * MAX(ID)的效率低得多。

Read more here