【问题标题】:MySQL PHP Order by Random for a certain time?MySQL PHP 随机排序一段时间?
【发布时间】:2018-08-15 20:46:01
【问题描述】:

例如,假设您希望每 10 分钟获得一次随机结果。有没有办法通过ORDER BY RAND() 实现这一目标?

$fetch = mysqli_query($conn, "
  SELECT * 
    FROM food 
    JOIN food_images ON food.size = food_images.size 
    ORDER BY RAND()
"); 

我也在使用JOIN 并担心这是否会影响答案。谢谢!

【问题讨论】:

  • 你的意思是,在接下来的 10 分钟内每次查询都希望得到相同的随机结果,然后在接下来的 10 分钟内希望得到不同的随机结果,以此类推?
  • @AlexHowansky 没错。如果可能的话。
  • 如果我没记错的话,ORDER BY RAND() 并不总是像您期望的那样工作,因为 MySQL(可能是某些版本)优化 RAND() 对单个调用的引用,而不是每次调用结果行。您可以改为执行SELECT *, RAND() AS seq .... ORDER BY seq 之类的操作,以确保不同的兰特结果。但是,如果总体结果很大,重复这些类型的查询可能会变得很昂贵。您可能需要考虑在启动时选择一个标识值列表,并让执行查询的代码随机选择标识符以进行更有针对性的查询。
  • 如果您不希望每次都得到相同的结果,您可以制作额外的表格,将数据放在每个 rand 上,并使用它从所有表格中挑选 rand。
  • @StupidKid 我想要相同的结果 10 分钟,然后在这 10 分钟结束后,制作一个新的结果。

标签: php mysql random time


【解决方案1】:

我面前没有 MySQL 服务器,所以大部分都是猜测,但您可以尝试如下:

您可以生成一个每十分钟只更改一次的数字,方法是将系统时间(以秒为单位)除以十分钟内的秒数,然后转换为整数:

$seed = (int) (time() / 600);

然后将此值传递给 MySQL 的 RAND() 函数作为参数来播种 RNG,您应该会得到一个每十分钟更改一次的可重复序列:

$stmt = mysqli_prepare($conn, 'SELECT ... ORDER BY RAND(?)');
mysqli_stmt_bind_param($stmt, 'i', $seed);

【讨论】:

  • 您可能希望对该查询进行基准测试,如果您有大型表,它可能会很昂贵,并且您可能希望切换到注意到的其他变体之一。种子的效果应该仍然以同样的方式应用。
  • 如果我这样做说有一千或更多行会发生什么?它会变慢还是可能发生什么?
  • 我不这么认为。与获取行或遍历索引相比,生成随机数的工作可以忽略不计。
  • ORDER BY RAND 通常会破坏您的数据库通常可能进行的任何索引使用。如果是对小表的简单查询,则无关紧要。您必须进行测试才能找到答案。
  • @AlexHowansky 欢迎;为了以防万一,我得给我打个电话;-) 我本可以被天知道是什么lol!
【解决方案2】:

你可以这样做:

SELECT *, rand(time_to_sec(current_time()) / 600) as ord
  FROM food 
  JOIN food_images ON food.size = food_images.size 
  order by ord

RAND() 函数的参数是种子。其中的表达式,每 10 分钟更改一次。

【讨论】:

  • 谢谢,但时间从哪里来? 10分钟后会有不同的结果吗?我只是想知道...
  • 对不起,我误读了您的问题。除非有办法添加种子,否则我不知道该怎么做。
  • 没关系,感谢您的回答+1
  • 其实我觉得有。
  • 啊,我忘了MySQL有这个功能可以轻松获取纪元时间!不错。
【解决方案3】:

您可以使用 MySQL Event Scheduler 并按照文档中的说明:

您正在创建一个命名的数据库对象,其中包含一个或多个 SQL 语句,这些语句将在一个或多个固定时间间隔执行,在特定日期和时间开始和结束

我猜你正在使用 php,所以你也可以使用 PHP Cron 作业,Managing Cron Jobs With PHP

【讨论】:

  • 他不想每 10 分钟运行一次查询,而是希望在需要时运行它,但在这 10 分钟内保持结果不变。
猜你喜欢
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
相关资源
最近更新 更多