Php 如何查询一个随机行,按最后6小时的优先级排序?

Php 如何查询一个随机行,按最后6小时的优先级排序?,php,mysql,random,Php,Mysql,Random,我有一个名为广告的表,我从中随机抽取记录 SELECT date, body FROM adverts ORDER BY rand() 使用记录date字段,如何仅对最近6小时内添加的随机记录进行优先级排序。我想要一张唱片 如果在过去六个小时内没有条目,则将搜索范围扩大到12、18,依此类推 有什么好办法吗?使用PHP和mySQL,您可以编写一个存储过程来处理逻辑: DELIMITER $$ CREATE PROCEDURE fetchSample( IN limit_size INT) BE

我有一个名为
广告
的表,我从中随机抽取记录

SELECT date, body FROM adverts ORDER BY rand()
使用记录
date
字段,如何仅对最近6小时内添加的随机记录进行优先级排序。我想要一张唱片

如果在过去六个小时内没有条目,则将搜索范围扩大到12、18,依此类推


有什么好办法吗?使用PHP和mySQL,您可以编写一个存储过程来处理逻辑:

DELIMITER $$
CREATE PROCEDURE fetchSample(
IN limit_size INT)
BEGIN
    DECLARE x  INT;
    DECLARE y  INT;

    SET x = 0;
    SET y = 0;

    WHILE x  <= 4 AND y = 0 DO

        SET  x = x + 1; 
        SET  y = (SELECT count(*) FROM adverts WHERE  yourDateTimeField BETWEEN 
        NOW() - INTERVAL CONVERT(6 * x, CHAR) HOUR AND NOW() ORDER BY rand()
        LIMIT limit_size);

    END WHILE;

    SELECT * FROM adverts WHERE  yourDateTimeField BETWEEN 
    NOW() - INTERVAL CONVERT(6 * x, CHAR) HOUR AND NOW() ORDER BY rand() 
    LIMIT limit_size;

END$$
DELIMITER ;
分隔符$$
创建过程获取示例(
在限制范围内(单位:整数)
开始
声明x INT;
声明y INT;
设置x=0;
设置y=0;

当x没有更多信息时,假设您使用的是
MySQL
,一个很好的方法是创建一个
变量
,该变量包含现在和时间变量之间的最小距离, 然后,选择与此时间对应的所有

您甚至可以选择该变量来了解当前时间和最短时间之间经过了多少小时

set @hours = (select min(hours) from (select TIMESTAMPDIFF(HOUR, 
your_time_variable,
curdate()) as hours from adverts) t);


SELECT * FROM adverts
WHERE (TIMESTAMPDIFF(HOUR, your_time_variable, curdate())) = @hours
ORDER BY rand();

您可以自定义这些内容以筛选所需内容。

我怀疑在一个查询中这样做是否值得。使用“
orderbyrand()”
选择随机行的方法总是非常昂贵,因此多次运行它不是一个好主意

这里还有另一个策略:找出确实有数据的最新时间窗口

SELECT CEILING(TIMESTAMPDIFF(HOUR, MAX(date), NOW()) / 6) * 6 FROM adverts;
例如,我测试了使用9小时前的时间戳向表中添加一行。上面的查询返回12

mysql> SELECT TIMESTAMPDIFF(HOUR, MAX(date), NOW()) FROM adverts;
+---------------------------------------+
| TIMESTAMPDIFF(HOUR, MAX(date), NOW()) |
+---------------------------------------+
|                                     9 |
+---------------------------------------+

mysql> SELECT CEILING(TIMESTAMPDIFF(HOUR, MAX(date), NOW())/6)*6 FROM adverts;
+----------------------------------------------------+
| CEILING(TIMESTAMPDIFF(HOUR, MAX(date), NOW())/6)*6 |
+----------------------------------------------------+
|                                                 12 |
+----------------------------------------------------+
通过这种方式,您可以知道用于随机选择查询的最佳时间长度:

SELECT date, body FROM adverts WHERE date >= NOW() - INTERVAL 12 HOUR
ORDER BY RAND() LIMIT 1;

您需要返回多少行?首先,请共享您的
SHOW CREATE TABLE adverts
和一些示例数据。因此,如果在过去6小时内找到一条记录,那么您不需要其他任何记录,如果在过去6小时内没有找到任何记录,那么您需要最后12条记录中的所有记录,即使它是100条记录?我只需要始终拉取一条记录。如果在过去6小时内没有添加任何内容,则将搜索扩展到12小时。使用PHP和MySQLI没有否决,但OP没有说他们使用的是编程语言(比如Java或PHP)。OP可能需要一个查询来返回他们需要的数据。@isaace我刚刚更新了我的答案。他可以用一个存储过程来完成逻辑。