Cum sa extrageti rapid un rand aleatoriu din baza de date?
3
Multe siteuri au nevoie de lucrul acesta.De exemplu magazinele online, pentru a afisa produse aleatoriu din baza de date; sau o galerie de imagini pentru a afisa aleatoriu imagini.
Exista mai multe metode pentru a extrage un rand dintr-o baza de date. Am sa prezint mai jos doua din aceste metode.
Prima metoda
Cea mai simpla metoda este folosirea functie RAND() in interogarea bazei de date.
SELECT * FROM `tabel` ORDER BY RAND() LIMIT 1;
Folosind aceasta interogare MySQL creaza un tabel temporal cu toate randurile, acestea sunt ordonate aleatoriu, iar primul rand dupa aceasta sortare este returnat. Din aceasta cauza aceasta metoda are timpul de executie cel mai mare, iar pentru tabele cu foarte multe randuri, ma refer la zeci/sute de mii, poate creea probleme.
A doua metoda
Pentru ca aceasta metoda sa functioneze trebuie ca fiecare rand sa aiba un id(unic).
$numarul = mysql_query(" SELECT MAX(`id`) AS maxim, MIN(`id`) AS minim FROM `tabel` "); $numarul = mysql_fetch_query($numarul); $aleatoriu = mt_rand($numarul['minim'], $numarul['maxim']); $rezultat = mysql_query(" SELECT * FROM `tabel` WHERE `id`>=$aleatoriu LIMIT 1 ");
In aceasta metoda folosim functiile MIN() si MAX(), pentru a afla minumul si maximul numarului de randuri din tabel. Stiind minimul si maximul, si cu ajutorul functiei mt_rand se alege un numar aleatoriu. Am ales functia mt_rand() in loc de rand(), deoarece prima este de patru ori mai rapida. In ultimul pas extragem randul din baza de date care are idul egal cu numarul aleatoriu sau mai mare in caz ca acesta id nu exista. Aceasta metoda are un timp de executie mai redus decat prima metoda.
A treia metoda
Aceasta metoda se bazeaza pe folosirea primului argument de la LIMIT x,y (din interogarea sql).Primul argument x, reprezinta punctul de plecare in afisarea randurilor, iar y numarul de randuri afisate. De ex: LIMIT 3,4 returneaza randurile 4,5,6,7.
$start1 = mysql_query( " SELECT FLOOR(RAND() * COUNT(*)) AS `numar` FROM `tabel` "); $start2 = mysql_fetch_array( $start1 ); $start = $start2['numar']; $rezultat = mysql_query( " SELECT * FROM `tabel` LIMIT $start, 1 " );
Pentru a afla acest „punct de plecare”, se alege un numar de la 0 la 1(folosind functia RAND()) si inmultim acest numar cu numarul de randuri din acela tabel(folosind functia COUNT()). Iar pentru ca argumentul de la LIMIT nu poate sa fie decat un numar natural, folosim functia FLOOR().
Aceasta metoda este cea mai rapida, din punct de vedere al timpului de executie, si este metoda pe care o recomand.
Atentie daca vreti sa va returneze 5 randuri, iar „punctul de plecare” este 97 din 100 de randuri, aceast script va putea sa returneze decat 3, si nu 5; la fel este si in cazul metodei 2.
Articol scris de dage.Multumim!
Daca acest articol contine o greseala, selecteaza cuvintele sau fraza gresita si tasteaza combinatia de taste Shift + Enter sau apasa click aici pentru a o raporta. Multumim!
Primele 2 metode le stiam, insa a 3a nu mi-a trecut prin cap ! 🙂 Anyway.. bine de stiut 😉
Social comments and analytics for this post…
This post was mentioned on Twitter by gclaudiu: RT @worldIT: Cum sa extrageti rapid un rand aleatoriu din baza de date? http://goo.gl/fb/JaND #WorldIT…
[…] Article translated from worldit.info. […]