【发布时间】:2011-07-24 23:35:31
【问题描述】:
在会话中存储随机选择的行?
嗨!
我正在构建一个 PHP 脚本,它从 MySQL 表中输出一个随机单词。每次刷新脚本时,我都希望显示一个新单词。 (它连接到jquery - 所以php-file的数据输出直接显示在我的页面上)
但是,我只想将每个单词显示一次。如果所有单词都被选中,我希望脚本重置并重新开始挑选。
现在我已经通过设置一个名为“visited”的附加表并将所有从表“wordlist”中选择的行以及用户唯一的会话 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 函数来说,这会不会太多,并且渲染速度会明显变慢?
谢谢!
【问题讨论】:
-
嗨,高原,很高兴您能够通过他们的正则表达式偷运问候语以删除问候语!这很同情! :-)
-
我认为在会话中存储使用过的单词的最大问题是没有让它们进入会话(您可以使用
serialize()和某种形式的in_array()的组合),但只有挑选他们没用过的词。您基本上要么有一个巨大的查询字符串 (NOT X, Y, Z...),要么有大量的查询。 (即,SELECT FROM...,if(in_array($X)){ SELECT FROM...; } -
托马斯:你在说什么软糖?