【问题标题】:Storing randomly picked rows in session?在会话中存储随机选择的行?
【发布时间】: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...; }
  • 托马斯:你在说什么软糖?

标签: php jquery mysql sql


【解决方案1】:

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

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

Read more here.

【讨论】:

  • 感谢您的回复,托马斯!你能给我一个关于如何用会话/关联数组解决这个问题的示例代码吗?我知道 ORDER BY RAND 的性能问题,但我还没有找到加权结果的解决方法再次感谢
猜你喜欢
  • 1970-01-01
  • 2012-06-24
  • 2012-05-02
  • 2011-05-06
  • 2017-01-03
  • 2010-11-19
  • 2014-04-27
  • 2011-06-30
  • 1970-01-01
相关资源
最近更新 更多