如何只从数据库中选择一次随机记录

时间:2013-01-19 21:42:09

标签: php mysql

我想创建一个PHP页面,它从MySQL数据库中选择一个随机记录(一个字符串,它将用作唯一的“标记”)。我想只选择一次该随机记录,之后再也不会。

为了做到这一点,我在表中添加了一个额外的字段(名为'numberfield',包含数字0),该字段在选择特定记录时递增。这样,只能选择numberfield表字段中值为0的记录。一旦选择了随机记录,数字字段就会增加到1,并且不能再选择。我正在考虑使用以下PHP代码:

$result = mysql_query("SELECT token FROM table WHERE numberfield < **1** ORDER BY RAND() LIMIT 0,1");

if (!$result) {
    echo 'Could not run query: ' . mysql_error();
    exit;
}

$row = mysql_fetch_row($result);
echo $row[0];
mysql_query("UPDATE table SET numberfield=numberfield+1 WHERE token=" + $row[0] + "");

这是正确的方法吗?有什么想法吗?

此外,我想在页面刷新时避免选择不同的随机记录。什么是将“令牌”保留在缓存中的正确和最简单的方法?例如,是否可以将“令牌”保留在页面刷新期间不会被覆盖的会话中,或者我是否必须使用其他技术(如Ajax等)。我们非常感谢您的帮助和评论!

1 个答案:

答案 0 :(得分:0)

  1. 您应该停止使用mysql_函数,因为它们已被弃用。
  2. 您应该避免在较大的表中使用ORDER BY RAND(),因为寻找随机数会产生开销。
  3. 要完成SELECT ... UPDATE,您需要某种锁定。很可能一行随机选择两次。使用存储过程可以防止这种情况。
  4. 您可以使用PHP或其中一部分生成的会话ID。 This topic讨论了会话ID的唯一性,this topic讨论了不同的长度。
  5. 您也可以在PHP端创建一个随机字符串,这样可以节省连接数据库的开销。