php - 避免在 Kohana 3 的 MySQL 查询中使用 RAND()

标签 php mysql random kohana-3

在我从事这个项目之前,我从未需要在 MySQL 数据库上执行随机 SELECT。经过研究,似乎一般人都说使用 RAND() 是个坏主意。我发现一篇文章解释了如何进行另一种类型的随机选择。

基本上,如果我想选择五 (5) 个随机元素,我应该执行以下操作(我在这里使用 Kohana 框架)?

<?php
final class Offers extends Model
{
    /**
     * Loads a random set of offers.
     *
     * @param  integer  $limit
     * @return array
     */
    public function random_offers($limit = 5)
    {
        // Find the highest offer_id
        $sql = '
            SELECT MAX(offer_id) AS max_offer_id
              FROM offers
        ';
        $max_offer_id = DB::query(Database::SELECT, $sql)
            ->execute($this->_db)
            ->get('max_offer_id');

        // Check to make sure we're not trying to load more offers
        // than there really is...
        if ($max_offer_id < $limit)
        {
            $limit = $max_offer_id;
        }

        $used = array();
        $ids = '';
        for ($i = 0; $i < $limit; )
        {
            $rand = mt_rand(1, $max_offer_id);
            if (!isset($used[$rand]))
            {
                // Flag the ID as used
                $used[$rand] = TRUE;

                // Set the ID
                if ($i > 0) $ids .= ',';
                $ids .= $rand;

                ++$i;
            }
        }

        $sql = '
            SELECT offer_id, offer_name
              FROM offers
             WHERE offer_id IN(:ids)
        ';
        $offers = DB::query(Database::SELECT, $sql)
            ->param(':ids', $ids)
            ->as_object();
            ->execute($this->_db);

        return $offers;
    }
}

如果不是,什么是更好的解决方案?

最佳答案

只要您的 offer_id 是连续的且连续的,这种方法就会奏效 - 如果您删除了一个 offer,您的 id 中可能会有间隙,这将是一个问题。

关于php - 避免在 Kohana 3 的 MySQL 查询中使用 RAND(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2778281/

相关文章:

php - 我可以假设 PHP 的 time() 和 MySQL 的 NOW() 是一样的吗?

php - 如何修改此 PHP 查询以添加数据库值 'timestamp'?

c - 为什么 rand() 产生相差 3 或 4 的整数?

php - while循环显示SELECT查询后的所有数据

PHP:通过值条目获取数组键。

php - Google 用来自 MYSQL 服务器的 Json 绘制折线图

php - Laravel 递归关系

php - 如果数据库为空,如何添加一条数据?

java - 无论种子如何,Random.nextBoolean() 总是返回 True

c - 随机化数组中的结果