Son 100 girdileri rastgele satır görüntüleniyor?

2 Cevap php

Ben şu anda tüm girdileri rastgele bir satır görüntüleyerek görüyorum ve gayet iyi çalışıyor.

SELECT * FROM $db_table where live = 1 order by rand() limit 1

şimdi, ben db son 100 girişleri sınırlamak istiyorum.

db her satır bir kimlik ve bir zaman damgası vardır.

Bu küçük bir veritabanı, bu yüzden havai minimizasyonu bir öncelik değil.

teşekkürler!

EDIT:

Hala çalışan olamıyorum .. Ben bir mysql_fetch_array hatası alıyorum:

"Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource

İşte benim kod hepsi:

<?php $sql = "SELECT * FROM
(SELECT * FROM $db_table ORDER BY $datetime DESC LIMIT 100)
ORDER BY rand() LIMIT 1";
$query = mysql_query($sql);
while($row = mysql_fetch_array($query)) {

echo "".$row['familyname']."";

} ?>

Tekrar teşekkürler!

2 Cevap

Bu benim başın üst kapalı ile geldi budur. Ben bunu test ettik ve SQLite çalışır, bu yüzden MySQL ile çok sorun olmamalıdır. Tek değişiklik SQLite'nın rastgele function () değil rand () rastgele oldu:

SELECT * FROM
  (SELECT * FROM $db_table ORDER BY $timestamp DESC LIMIT 100)
ORDER BY rand() LIMIT 1

This page bir ORDER BY RAND()-tipi sorgu optimize etmek için nasıl bir oldukça ayrıntılı writeup vardır. Beni yeterince SO (genel kavram mantıklı olsa da, ben tamamen, kullanılan SQL komutları bazı anlamıyorum) açıklamak için aslında çok yer var, ama nihai optimize sorgu çeşitli optimizasyonlar kullanır:

  1. İlk olarak, ORDER BY RAND(), tüm tablo üzerinde bir filesort algoritması kullanır, hangi bırakılır. Bunun yerine, bir sorgu, sadece tek bir rastgele kimliği oluşturmak için imal edilir.
  2. Bu aşamada, bir index scan daha az etkili bir filesort birçok durumda daha olan, kullanılan, bu nedenle bu alt sorgu uzak optimize edilmiştir.
  3. WHERE madde a JOIN, dış SELECT tarafından getirilen satır sayısını azaltmak ve kaç kez sorgu yürütülür sadece ile değiştirilir 1..
  4. (Silinmeden) kimlikleri delikleri için hesap ve eşit dağılımını sağlamak amacıyla, bir eşleştirme tablosu kimlikleri satır numaralarını harita oluşturulur.
  5. Tetikleyiciler de otomatik güncelleme ve eşleştirme tablosunu korumak için kullanılır.
  6. Son olarak, saklanan prosedürler birden fazla satır seferde seçilmesine izin oluşturulur. (Burada, ORDER BY yeniden, ama sonuç satırları sadece kullanılır.)

İşte performans rakamlar:

  • Q1. RAND ORDER BY ()
  • Q2. RAND () * MAX (ID)
  • Q3. Kimliği BY RAND () * MAX (ID) + SİPARİŞ
   100        1.000      10.000     100.000    1.000.000
Q1  0:00.718s  0:02.092s  0:18.684s  2:59.081s  58:20.000s
Q2  0:00.519s  0:00.607s  0:00.614s  0:00.628s   0:00.637s
Q3  0:00.570s  0:00.607s  0:00.614s  0:00.628s   0:00.637s