Kohana 3 MySQL sorguda RAND () kullanımını kaçınmak

2 Cevap php

Ben üzerinde çalışıyorum bu proje kadar MySQL DB rasgele SEÇ yapmak için bir ihtiyaç yoktu. Araştırma yaptıktan sonra bu genel kalabalık RAND () kullanarak kötü bir fikir olduğunu söylüyor gibi görünüyor. Ben rastgele seçme başka tür yapmak için nasıl açıklayan bir makale bulunamadı.

Ben beş (5) rasgele öğeleri seçmek istiyorsanız Temelde, (Ben burada Kohana framework kullanıyorum) aşağıdakileri yapmanız gerekir?

<?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;
    }
}

Eğer değilse, daha iyi çözüm nedir?

2 Cevap

Bu yaklaşım sürece offer_id en sıralı ve tüm sürekli olarak çalışacaktır - Hiç bir teklif kaldırırsanız, o zaman bir sorun olacağını id yıllardan boşluklar olabilir.

Ben MySQL rand (büyük masa setleri) işlevi hakkında aynı şeyleri okudum, ama ben bir kaç dizin oluşturmak PHP'nin rand yerleşik (0, sayım) sonra kullanarak, tablo satırları sayarak daha hızlı yapabileceğini düşünürdüm Kimliği adlı bir SELECT yakalayabilir. Ben aynı etkiye sahip ama tüm performans kaygıları olmadan sanıyorum.