MySQL:随机选择持续一段特定时间?

时间:2010-02-04 13:17:07

标签: php sql random

好的......我又迷路了。如何为rand()创建自定义种子,以便在特定时间段内保留数据库中的选择:10分钟,1小时,1天等。

我用这个:

$query = 'SELECT * FROM table order by rand () LIMIT 1';

每次刷新页面时都要随机选择。我已经阅读了几天,但我找不到一个例子来解释如何制作一个自定义种子,以保持选择一段特定的时间。请帮帮我...... 叹息

7 个答案:

答案 0 :(得分:1)

您可以创建临时表:

SELECT * INTO #temp FROM table ORDER BY rand() LIMIT 1

然后查询临时表以显示您的数据。超时后删除/重新创建表。

答案 1 :(得分:1)

如果您正在使用PHP,您可以创建一个算法,该算法生成一个随机数(使用rand()),然后将此数字保存在数据库或文件中的某个位置。然后检查当前日期和随机数的生成日期。计算差值并使用if语句确定是否需要再次生成随机数。这是一些伪代码(请注意,按日期我的意思是时间戳或Unix时间):

$gendate = getGenerationDateFromDB();
$now = getCurrentDate()
if(getDifference($gendate, $now) > [time interval]) then
  $randnum = generateRandNumber();
  saveRandNumberInDB($randnum);
  saveGenDate();
else
  $randnum = getRandNumberFromDB();

答案 2 :(得分:1)

我对这个概念有所了解,而不是正式的解决方案:

在倒圆md5()上使用UNIX_TIMESTAMP()/60。表格中有许多记录,让它为X.计算md5()中的数字,将其设为Y.计算Y % X,将其设为Z.使用limit 1 offset Z在SQL的末尾。

答案 3 :(得分:1)

正如多米尼克罗杰所说 - 兰德的命令太可怕了。 但是我觉得使用cron太大了枪。 (尤其是你不知道怎么做)

你应该在php中生成一个随机整数并存储它并将其传递给mysql:

SELECT * FROM table WHERE id=(MOD('.$php_generated_random.', LAST_INSERT_ID())+1)

它得到一个大的随机数,并且模数,所以它不会超过表长度。

LAST_INSERT_ID()存在问题。在很多情况下,你的mysql可能会返回0。

所以好'安全的方式这样做:

  1. 检查是否是时候生成新的随机
  2. 如果是这样,那么从表中获取最大id(假设表长度有时会改变)
  3. 生成一个随机数作为id
  4. 存储ID和世代时间
  5. 并且只选择id = $ sth

    的位置

答案 4 :(得分:0)

选择后,您需要将该数据存储到会话中,并且会话可以设置为您指定的时间。无需每次都查询数据库。其次,查询与在特定时间内设置广告/时间无关。

答案 5 :(得分:0)

ORDER BY RAND()是一个非常糟糕的主意 - 它会破坏数据库性能。

这是你应该在cron作业上运行的那种事情,就像你希望“随机选择”持续一样,并存储随机选择分钟/小时/天的行的ID。您需要注意确保该行不会被删除。

答案 6 :(得分:0)

“创建自定义种子”

我相信这个问题要你做这样的事情:

$query = 'SELECT * FROM table order by rand (' . get_seed() . ') LIMIT 1';

<?php
// return the current hour.  so the seed is the same each hour
function get_seed() {
  return date('H');
}
?>

'种子'的目的是为测试目的创建相同的随机序列。

RAND(N)如果指定了常量整数参数N,则将其用作种子值,从而生成可重复的列值序列。