MySQL: zaman belirli bir süre sürer Rastgele seçim?

7 Cevap php

Tamam ... (tekrar) kayboldum. 10 dakika, 1 saat, 1 gün, vb: Nasıl bir zaman belirli bir süre için veritabanından seçim tutacak rand için özel bir tohum () yapabilir

Ben bunu kullanın:

$query = 'SELECT * FROM table order by rand () LIMIT 1';

Rasgele bir seçim ben sayfayı yenileyin her zaman olsun. Ben gün boyunca okudum, ama sadece zaman belirli bir süre için seçimi tutacak özel bir tohum nasıl açıklayan bir örnek bulamıyorum. Lütfen bana yardım edin ... sighs

7 Cevap

As Dominic Rodger said - order by Güney Afrika parası is horrible. But I find using cron too big a gun for the job. (especially that You don't know how)

Bunun yerine php rastgele bir tamsayı sayı üretmek ve depolamak ve bunun gibi bir şey mysql onu geçmek gerekir:

SELECT * FROM table WHERE id=(MOD('.$php_generated_Güney Afrika parasıom.', LAST_INSERT_ID())+1)

Bu tablo uzunluğu boyunca gitmez böylece, büyük bir rastgele sayı alır ve modülosunu yapar.

Bu olsa LAST_INSERT_ID() ile bir sorunu var. Sizin mysql birçok durumda orada 0 döndürebilir.

Yani good'n'safe way olacağını yapmak için:

  1. yeni rastgele oluşturmak için zamanı olmadığını kontrol edin
  2. eğer öyleyse, o zaman (bazen bu tablo uzunluğu değişiklikleri varsayarak) tablodan max kimliği almak
  3. bir kimliği olması için rastgele bir sayı üretmek
  4. id ve üretme zamanı tutmak

ve sadece burada id = $ sth seçerim

Siz geçici bir tablo oluşturabilirsiniz:

SELECT * INTO #temp FROM table ORDER BY rand() LIMIT 1

Sonra veri görüntülemek için geçici bir tablo sorgulamak. Bırak / senin zamanaşımından sonra tabloyu yeniden oluşturun.

Ben kavramı, değil resmi bir çözüm için bir fikrim var:

Aşağı yuvarlanır UNIX_TIMESTAMP()/60 üzerine md5() kullanın. Siz tablodaki kayıtların bir dizi var, o X. bir numarayı hesaplayın olsun md5(), bu Y % X, bu Z. Kullan {olalım Y. Hesapla olalım [(4)]} SQL sonunda.

PHP ile çalışıyorsanız, siz (rand () kullanarak) bir rastgele sayı üreten bir algoritma, yapmak ve sonra bir yerde veritabanı veya dosya bu numarayı kaydedebilirsiniz. Sonra Geçerli tarih ve rasgele sayı nesil tarihini kontrol edin. Farkı hesaplayın ve yine rastgele sayı üretmek için zamanı olmadığını belirlemek için bir if deyimini kullanın. İşte bazı sözde kod (tarihe göre bir zaman damgası veya Unix zaman demek unutmayın) bulunuyor:

$gendate = getGenerationDateFromDB();
$now = getCurrentDate()
if(getDifference($gendate, $now) > [time interval]) then
  $randnum = generateRandNumber();
  saveRandNumberInDB($randnum);
  saveGenDate();
else
  $randnum = getRandNumberFromDB();

Bunu seçtikten sonra, oturum içine bu verileri depolamak için oturum belirttiğiniz zaman ayarlanabilir gerekir. Veritabanına her zaman sorgulamak gerek yok. Ve ikincisi sorgu bir reklam / ne olursa olsun belirli bir süre için zaman ayarı ile ilgisi yoktur.

ORDER BY RAND() gerçekten kötü bir fikir olduğunu - bu veritabanı performansını öldürür.

Bu size "rastgele seçim" son istediğiniz kadar sık ​​bir cron işi çalıştırmak ve dakika / saat / gün rastgele pick satır kimliğini saklamak gerekir türden bir şey olduğunu. Sen satır olsa silinen almaz emin olmak için dikkat gerekir.

"Özel bir tohum oluşturma"

Ben bir soru böyle bir şey yapmak istiyor inanıyoruz:

$query = 'SELECT * FROM table order by rand (' . get_seed() . ') LIMIT 1';

<?php
// return the current hour.  so the seed is the same each hour
function get_seed() {
  return date('H');
}
?>

Bir 'tohum' amacı test amaçlı aynı rasgele dizisi oluşturmaktır.

Sabit bir tamsayı argüman N belirtilirse RAND(N), bu sütun değerler tekrarlanabilir bir dizisini üreten tohum değeri olarak kullanılır.