【问题标题】:Php/MySQL help - random daily pick?PHP/MySQL 帮助 - 每日随机选择?
【发布时间】:2011-01-09 22:44:38
【问题描述】:

我正在尝试从我的数据库中获得一个可以持续一天的选择(每日选择)。我使用以下代码:

$query = 'SELECT * FROM table ORDER BY rand() LIMIT 1

但正如你所见,它只给了我一个随机选择,每次我刷新页面时,它都会给我一个新的随机选择。我怎样才能使选择持续一整天?

提前致谢


我正在尝试这个:

$query = "SELECT * FROM table ORDER BY rand(" . date("Ymd") . ") LIMIT 1";

但我收到以下错误:mysql_fetch_assoc():提供的参数不是有效的 MySQL 结果资源。这是被破坏的部分:

$results = mysql_query($query); 

while($line = mysql_fetch_assoc($results)) 

所以...它应该看起来像这样,对吧? (我的意思是,选择每日随机选择?)

$dailyPick = 'SELECT * FROM table ORDER BY rand() LIMIT 1'; 

$cacheKey = 'dailyPick'. date('dmY'); 
if($cache->has($cacheKey)) { 
    $dailyPick = $cache->get($cacheKey); 
} else { 
    // hit database 
    $dailyPick = $cache->save($cacheKey); 
} 

我现在正在尝试:

$dailyPick = 'SELECT * FROM table ORDER BY rand() LIMIT 1';  

$cacheKey = 'dailyPick'. date('dmY');  
if($cache->has($cacheKey)) {  
    $dailyPick = $cache->get($cacheKey);  
} else {  
    // hit database  
    $dailyPick = $cache->save($cacheKey);  
}  

但是,我在非对象上使用了“has”函数,这让我误会了。

【问题讨论】:

    标签: php mysql random


    【解决方案1】:

    如果您将 rand 的 SEED 设置为每天变化的整数值,那将解决您的问题

    $query = "SELECT * FROM table ORDER BY rand(" . date("Ymd") . ") LIMIT 1";
    

    会成功的。

    【讨论】:

    • +1 伙计,我不知道 RAND() 接受的论点,这是一个绝妙的主意!
    • @Izumi:试试$query = "SELECT * FROM table ORDER BY rand(" . date('Ymd') . ") LIMIT 1;";
    • “贵”是什么意思?
    • 用昂贵的 Jacco 表示,它比其他可能更精简的方法从您的系统中消耗更多的能量。
    • 谁能向我解释为什么代码被破坏并且它说提取无法正常工作......
    【解决方案2】:

    我认为您需要使用“今天”字段 = 1 更新随机选取的记录..

    类似这样的:

    // ------------
    // Run this 3 commands once a day
    
    // Reset all records
    mysql_query("UPDATE `table` SET `today` = 0");
    
    // Pick one
    $sql = mysql_query("SELECT `id` FROM `table` ORDER BY RAND() LIMIT 1");
    $id = mysql_result($sql, 0, 'id');
    
    // Update the record
    mysql_query("UPDATE `table` SET `today` = 1 WHERE `id` = {$id}");
    
    // ------------
    
    // Now you can find again your "random found record":
    $query = mysql_query("SELECT * FROM `table` WHERE `today` = 1");
    

    【讨论】:

    • 我只是不明白'每天运行一次'是什么意思......这不会删除我的表吗?或者它创建一个名为“今天”的新表?对不起……我只是不明白……叹了口气,往下看
    【解决方案3】:

    你可以试试这样的:

    $total = 'SELECT COUNT(*) FROM table;';
    $query = 'SELECT * FROM table ORDER BY id ASC LIMIT 1 OFFSET ' . (date('Ymd') % $total) . ';';
    

    【讨论】:

    • Gnutt 的解决方案要优雅得多!
    【解决方案4】:

    这样做的明智方法是自动通过设置为每天运行一次的 cron 作业生成精选的当天内容

    因此,cron 作业将执行您提供的 SQL 并将适当的内容存储在平面文件/数据库表等中(或者甚至可能只是将选择的 id 存储在另一个表中以供将来查找)。

    【讨论】:

    • 这是最好的方法。随机选择只进行一次。在此之后,显示您的每日选择是一个快速而简单的选择查询。
    猜你喜欢
    • 2011-03-02
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2015-12-22
    • 1970-01-01
    相关资源
    最近更新 更多