Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Losowanie rekordów bez obciażenia serwera
Forum PHP.pl > Forum > Przedszkole
emanuel
Tabela MYSQL ma milion rekordów, a może mieć nawet kilkanaście razy więcej.
Potrzebuję wylosować z niej X rekordów i wyświetlić informację zawarta w ich polach
Przykładowo mam takie zapytanie które wykonuje oczekiwane zadanie ale obciąża zasoby serwera.

CODE
<?
$zapytanie_sr = "SELECT pole FROM tabela ORDER BY RAND() LIMIT 20";
$wykonaj_sr = mysql_query($zapytanie_sr);
while($rek_sr = mysql_fetch_array($wykonaj_sr))
{
$tekst_sr=$rek_sr['pole'];

//wyświetlanie wyniku zapytania

echo "<font size=2 face=Arial>";
echo"
<B>$tekst_sr</B>
";
echo "</font><br>";
}

?>


Jak rozwiązać żeby obciążenie było minimalne i nie trzeba było czekać na wyświetlenie wyniku?
rafalp
Moja propozycja:

  1. <?php
  2. $los[0] = rand(1, $ilość_rekordów_w_bazie); // ilość rekordów np. za pomocą COUNT(*)
  3. $los[1] = rand(1, $ilość_rekordów_w_bazie); // lub jeśli więcej to w pętli (for)
  4. ?>


+ zapytanie


  1. SELECT pole FROM tabela WHERE (id=$los[0] OR id=$los[1] OR id=$los[2])
itp

zakładając że masz w tabeli kolumne ID. Następnie jeśli pola ID a autoinkrementacją mogą być usuwane to dać jakiś warunek sprawdzający czy jest wyników tyle ile chcemy jeśli nie do powtórzyć losowanie lub wybrać dodatkowo jeszcze jakieś pole.
dr_bonzo
A co z przerwami w IDkach?

http://akinas.com/pages/en/blog/mysql_random_row/ - jak losowac JEDEN rekord w 1 zapytaniu, moze ci sie przyda
rafalp
Cytat(dr_bonzo @ 29.06.2008, 18:11:22 ) *
A co z przerwami w IDkach?

tak jak napisałem wcześniej:
Cytat
Następnie jeśli pola ID a autoinkrementacją mogą być usuwane to dać jakiś warunek sprawdzający czy jest wyników tyle ile chcemy jeśli nie do powtórzyć losowanie lub wybrać dodatkowo jeszcze jakieś pole.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.