RAND() használata lekérdezésekben
Sziasztok!
A célom, az hogy frissítésenként másik sort jelenítsen meg a programom. Ez
sikerült is, de azt nem értem, hogy néha miért nem jelenik meg semmi?
Ezt hogyan tudnám kikerülni, hogy ne legyen üres megjelenés, hanem mindig
jelenítsen meg egy sort?Ezzel kapcsolatban még abban is szeretnék segítséget vagy tanácsot, hogy
az hogyan oldható meg, hogy egy véletlen kiválasztott sor, ne a
következő oldalfrissítésig legyen látható, hanem egy napig vagy egy
hétig is és egy hét után frissítse magát újra?
Ezt már úgy, hogy a honlap összes látogatójának ugyan az jelenjen meg
az adott időben.
■ A célom, az hogy frissítésenként másik sort jelenítsen meg a programom. Ez
sikerült is, de azt nem értem, hogy néha miért nem jelenik meg semmi?
Ezt hogyan tudnám kikerülni, hogy ne legyen üres megjelenés, hanem mindig
jelenítsen meg egy sort?
$sql = "SELECT * FROM tablam WHERE id ORDER BY rand() LIMIT 1";
az hogyan oldható meg, hogy egy véletlen kiválasztott sor, ne a
következő oldalfrissítésig legyen látható, hanem egy napig vagy egy
hétig is és egy hét után frissítse magát újra?
Ezt már úgy, hogy a honlap összes látogatójának ugyan az jelenjen meg
az adott időben.
Kerülendő
A javbasolt megoldás alapja valami ilyesmi:
A véletlen korlátozását úgy oldhatod meg, hogy a PHP srand függvényével a random seedet az időből generálod pl ha 5 percig álladó rekordot szeretnél:
Gyakoriság
A kérdezőnek:
A query-ben elég rosszul néz ki az a "where id order by rand"
nem tábla, hanem recordset
Ajánlott olvasmány Jan Kneschke írása:
http://jan.kneschke.de/projects/mysql/order-by-rand/.
Szép összefoglalás
Nem létező ID-t kiiktatni
Minden jó, csak még azt nem sikerült megoldanom, hogy nem létező id esetén ne a nagy semmi jelenjen meg, hanem keressen egy új id-t.
Ez most a kódom:
sorsolás
Világos
Kábé
hatékonyabb?
valóban igazad volt
itt
A cikk megoldásához
A logikai buktató pedig az, hogy egy nagy "lyukat" követő rekord sokszorta gyakrabban fog megjelenni. Pl a következő id-knél: {1, 2, 3, 4, 5, 10} a 10 lesz a megoldás, ha 6, 7, 8, 9 vagy 10 a random szám, amivel ötször akkora a valószínűsége, mint a többi rekordnak. Ezt azért meg kellett volna említeni a cikk szerzőjének. (Rosszul veheti ki magát például ha az egyik előfizetőt látszólag favorizáljuk a többiek kárára).
valószínűség
van amire nem gondoltam?
Nem kell rendezni
Az már más kérdés, hogy ilyen módszerrel valóban nem lehet egyenletes eloszlással véletlenszerűen kiválasztani egy sort, az említett lyukak miatt.
táblatípus függő
felesleges while
Szóródás
Tiszta vizet
Here's some ado: 10%-kal több rekordot hoztam létre a célzott számnál, majd 10%ukat töröltem egy
delete from random where rand() * 10 < 1; kverivel, úgyhogy a reodok száma nem fix, a lyukak száma pedig 10% körüli.
Amit én leszűrtem:
- Ezer rekord körül sincs lényeges eltérés a futási időben (memóriafoglalást nem viszgáltam).
- Ezen a szinten WHILE-os módszer a lyukak arányában több időt használ (hoiszen ennyiszer kell új kverit futtatni).
- A LIMIT-es lekérdezés picit több időbe kerül, de nem kell ismételni, mint a while-t és igazságosan sorsol.
köszi
szerk: a limit és a 10000 kereszteződésénél az tényleg ilyen sok lett?
igen
Több különböző sort egyszerre
Azt nem sikerült megoldanom, hogy egyszerre 2, 3 vagy több sort válasszon ki véletlen.
Ezzel a véletlen szám generálóval ezt meglehet oldani?
Csak a Limit paranccsal sikerült, de akkor is sokszor volt, hogy kétszer is kiírt egy sort.
Szóval, ha több sort szeretnék véletlen kiválasztani a táblámból és nem szeretném, hogy ugyan azt a sort kétszer is kiírja, akkor mi a teendő?
Mondjuk a következő csak
mehet máshol is