【问题标题】:MySQL: Random pick that lasts for a specific period of time?MySQL:持续特定时间段的随机选择?
【发布时间】:2010-02-04 13:17:06
【问题描述】:

好吧……我又迷路了。如何为 rand() 制作自定义种子,以将数据库中的选择保留特定时间段:10 分钟、1 小时、1 天等。

我用这个:

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

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

【问题讨论】:

  • 您没有从各种提案中选择答案这一事实表明,没有人了解您想要什么。我看到“特定时间段”和“每次刷新”之间存在冲突。你应该更好地描述问题。不要提及您自己的“解决方案” - 我认为提及“自定义种子”只是混淆了事情。请说明您的数据库的性质(实际应用程序或作业)、随机选择的使用(仅您的网页或其他数据库用户)以及什么条件触发需要另一个随机选择。

标签: php sql random


【解决方案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和生成时间

并且只选择 id=$sth

【讨论】:

    【解决方案2】:

    您可以创建一个临时表:

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

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

    【讨论】:

      【解决方案3】:

      我对这个概念有一个想法,而不是正式的解决方案:

      在向下取整的UNIX_TIMESTAMP()/60 上使用md5()。表中有多条记录,设为 X。从md5() 计算一个数,设为 Y。计算Y % X,设为 Z。在 SQL 末尾使用limit 1 offset Z .

      【讨论】:

      • 您可以使用整个 md5 和的最后一些十六进制数字。
      • md5 是一个半唯一的校验和函数。像CRC。它用于标记/验证 ISO 映像。 en.wikipedia.org/wiki/MD5 它可以从任何字符串中生成 d41d8cd98f00b204e9800998ecf8427e 之类的东西。非常混乱。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 再一次 - 不知道该怎么做...... -newbie-
        【解决方案6】:

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

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

        【讨论】:

        【解决方案7】:

        “创建自定义种子”

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

        $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,它将用作种子值,从而产生可重复的列值序列。

        【讨论】:

        • 但它只会随机化 N 次,对吧?它不会持续一段时间...或者?...
        • 在我的例子中,N 是当前时间。
        • 这不是一个问题(创建一个种子)......那是我试图解释我认为我需要什么......你发布它的方式,它会保留一个小时的选择吗?然后换一个新的?
        猜你喜欢
        • 2012-04-07
        • 1970-01-01
        • 2012-07-10
        • 1970-01-01
        • 2011-04-16
        • 2019-07-16
        • 2017-09-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多