2013-06-04 19 views
5

Rand ismini kullanarak randevuyu kullanmanın bir yeri olduğunu hatırlıyorum() kötü ve sadece bunu başlatıp bunu kanıtlayan bir makale buldum. Rand() ile sipariş büyük veritabanları ile çok yavaş olabilir ve önerilen çözüm, php'de rastgele bir sayı oluşturmak ve ona göre seçim yapmaktır. Sorun, kayıtlarımı geri döndürmek için diğer alanları doğrulamamız gerektiğidir. Ayrıca silinmiş bazı eski kayıtlar da olabilir, bu da bir soruna neden olabilir. Herhangi biri belirli koşullarla eşleşen bir tablodan birkaç rasgele kayıt seçmek için iyi bir yol sağlayabilir mi (örneğin paid alanı 1'e eşit olmalıdır)?Rastgele sonuç döndürmek (sırası ile rand())

+0

Eğer php kullanıyorsanız, 'shuffle' işlevini kullanın. sonuçlarınızı alın ve programınızda karıştırın. –

+0

Peki ya 100,000 sonuç döndüyse, o kadar çok sayıda sonuç almak için php içine çok sayıda sonuç çeken bu –

+0

@FabianBigler'ı almak istemiyorum. N '. – Kevin

cevap

2

Onlara ne kadar rastgele ihtiyacınız var? Eğer bir süper ihtiyacım yok bile dağıtım deneyin bu %(random_number)s Eğer sorgu RAND() tarafından sipariş olabilir

+0

Bu güzel bir fikir, ancak aynı sonuçları bir dizi defa görüntüleme riskini göze alamıyorum. Bu sadece insanlara kötü bir randomizasyon sistemine sahip olduğumu söyleyecektir. + re –

+0

@php_nub_qq olsa bile her seferinde – cmd

+0

sorgusunu gerçekleştirdiğinizde yeni bir rasgele sayı oluşturuyorsanız farklı bir kayıt olacak Evet biliyorum ama 2 - 8 kayıt döndürmem gerekiyor. Rastgele sayı maks (pk_id) -8 (maksimum rand değeri olarak belirlediğim) ise, pk_id-7 ve pk_id-6 her zaman gösterilecektir. Ve eğer 8 sayısı 8 ise geri dönmek zorunda olduğum kayıt sayısı her zaman ardışık olacaktır. Ben 8 ayrı sorgular çalıştırmak istemiyorum –

7

nedeni her çalıştırdığınızda rejenere max(pk_id)-1 için 0 rastgele numarasını içeren bir bağlama değişkeni olan

select min(pk_id) from my_table where pk_id > %(random_number)s and paid=1 

Yavaş yavaş, bir şey döndürmeden önce tablonun tamamını sıralamak için veritabanını zorlamanızdır. Sadece yükün tek bir tabloya indirgenmesi daha hızlıdır (yine de biraz yavaş olsa da). ,

SELECT * 
    FROM my_table 
    WHERE RAND() < 0.1 
ORDER BY RAND() 
    LIMIT 100 

Bu tablodaki tüm satırları yaklaşık% 1'ini seçecektir bunları sıralamak ve Sadece üst 100'e dönmek:

Bu

adil sıralamayı kaçınarak yol parçasını almak anlamına gelir Burada ana sorunun (yanı cmd'nin cevabı ile birlikte), sorgunun hiçbir şey döndürmediğinden emin olamayacağınızı unutmayın. Yukarıdaki yaklaşım, tam bir tablo taraması (hangi satırların kullanılacağına karar vermek için) ve ardından satırların yaklaşık% 1'ini içermelidir. Çok fazla satırınız varsa, yüzdeyi buna göre azaltabilirsiniz.

+0

Bir şeyleri iade edeceğime ve geri dönen kayıtların tamamen rastgele olduğundan emin olmam gerektiğinden emin olmalıyım. Daha iyi bir seçenek yoksa, @ cmd'nin önerisini kullanırdım ve birkaç soruyu daha fazla çalıştırırdım. –

+0

Fakat @ cmd'nin önerisi aynı zayıflığa sahip - bir şey döndüreceğinden emin olamazsınız. – mzedeler

+0

Neden değil? Bir şeyi nasıl iade edeceğini anlamıyorum. –

İlgili konular