[php/mysql] random record uit dbase halen

Pagina: 1
Acties:
  • 107 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • nikao
  • Registratie: November 1999
  • Laatst online: 10-02-2022
ik wil dus een random record uit de database halen..

nu deed ik dit eerst door het aantal records te tellen.. een random getal aan te maken.. en vervolgens in de query een where conditie te maken waarin het id gelijk moest zijn aan het random getal..

maarrr. probleem hierbij is dat als je een record hebt weggegooid .. dat id niet meer bestaat.. en het dus kan voorkomen dat je nix terugkrijgt.

nu heb ik op tweakers gezocht en deze query gevonden:

PHP:
1
$query="select * from  wistudat_content order by rand() limit 1";


dit lijkt op het eerste gezicht wel te werken.. maar na een beetje goed opletten en testen blijkt dat hij bepaalde records wel heeeel vaak terughaalt..terwijl anderen nooit gepakt worden..

iemand enig id waar dit aan kan liggen?

Acties:
  • 0 Henk 'm!

  • Suepahfly
  • Registratie: Juni 2001
  • Laatst online: 17-09 17:05
PHP:
1
$result = mysql_query("SELECT veld1, veld2 ORDER BY RAND() LIMIT 0,1");


Zo uit mijn hoofd.

Anders even op mysql.com kijken en zoeken naar rand

edit:

Query gewijzigt

[ Voor 20% gewijzigd door Suepahfly op 25-10-2003 19:29 ]


Acties:
  • 0 Henk 'm!

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Suepahfly schreef op 25 October 2003 @ 19:26:
PHP:
1
$result = mysql_query("SELECT veld1, veld2 WHERE veld1 RAND()");


Zo uit mijn hoofd.

Anders even op mysql.com kijken en zoeken naar rand
Dit is exact de query die de TS gebruikt. (welke correct is) De TS moet eens gaan kijken of je wellicht de random moet seeden? Anders wellicht PHP (mocht je die gebruiken) hiervoor gebruiken?

[ Voor 4% gewijzigd door Spider.007 op 25-10-2003 19:29 ]

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Acties:
  • 0 Henk 'm!

  • Anders
  • Registratie: December 2000
  • Laatst online: 13-09 18:52
Let even op bij ORDER BY RAND() LIMIT 0,<weinig>

MySQL sorteert hiermee namelijk eerst de hele tabel random, en past pas dan die limit toe. Ik moest vrijdag een (1) random nummer hebben uit een database met 15 miljoen nummers, en dat kostte hiermee ettelijke minuten. Gebruik deze methode derhalve alleen bij kleinere tabellen, dan is er geen vuiltje aan de lucht.

Ik spoor veilig of ik spoor niet.


Acties:
  • 0 Henk 'm!

  • nikao
  • Registratie: November 1999
  • Laatst online: 10-02-2022
en bij groteren tabellen?.. hoe kun je het dan het handigst doen?..

Acties:
  • 0 Henk 'm!

  • nikao
  • Registratie: November 1999
  • Laatst online: 10-02-2022
nou.. ik heb mijn limit 1 in limit 0,1 veranderd.. maar het is nog echt niet random..
ik heb 2records die echt heel vaak eruit worden gehaald..

het staat overigens hier of om hem echt remote te zien staat hij o.a hier

Acties:
  • 0 Henk 'm!

Verwijderd

Als je rand gebruikt moet je alles ff schudden en mixen etc ... Zie de
extra twee regels.

Als je het zo doet moet het wel lukken.

code:
1
2
3
4
srand((double)microtime()*1000000);  
$SQLSeed = rand(1000000,9999999);
 
$query = select * from tabel1 order by rand($SQLSeed)limit 0,1;

Acties:
  • 0 Henk 'm!

  • cdgrit
  • Registratie: Mei 2002
  • Laatst online: 13-01 16:44
Anders schreef op 26 October 2003 @ 02:16:
Let even op bij ORDER BY RAND() LIMIT 0,<weinig>

MySQL sorteert hiermee namelijk eerst de hele tabel random, en past pas dan die limit toe. Ik moest vrijdag een (1) random nummer hebben uit een database met 15 miljoen nummers, en dat kostte hiermee ettelijke minuten. Gebruik deze methode derhalve alleen bij kleinere tabellen, dan is er geen vuiltje aan de lucht.
Bestaat er een manier om dit sneller te doen?
De optie die 'D32' hierboven geeft werkt nog steeds volgens hetzelfde principe volgens mij. Misschien beter willekeurig, maar op grote tabellen nog steeds langzaam toch?


Originele startpagina - Stadindex.nl


Acties:
  • 0 Henk 'm!

  • nikao
  • Registratie: November 1999
  • Laatst online: 10-02-2022
Verwijderd schreef op 26 October 2003 @ 10:10:
Als je rand gebruikt moet je alles ff schudden en mixen etc ... Zie de
extra twee regels.

Als je het zo doet moet het wel lukken.

code:
1
2
3
4
srand((double)microtime()*1000000);  
$SQLSeed = rand(1000000,9999999);
 
$query = select * from tabel1 order by rand($SQLSeed)limit 0,1;
ah dit werkt perfect!.. bedankt :D

Acties:
  • 0 Henk 'm!

  • slm
  • Registratie: Januari 2003
  • Laatst online: 12-11-2023

slm

cdgrit schreef op 26 October 2003 @ 10:44:
Bestaat er een manier om dit sneller te doen?
De optie die 'D32' hierboven geeft werkt nog steeds volgens hetzelfde principe volgens mij. Misschien beter willekeurig, maar op grote tabellen nog steeds langzaam toch?
In mysql alleen? Nee.

Wat je wel kan doen is:
1. bepaal max(id)-1
2. php/asp: zet var = (randomfunctie(seednr) * max(id) +1)
3. mysql: select <blaat> from db where id=var

Je moet dan alleen geen records verwijderen (anders moet je daar wat omheen bouwen).

To study and not think is a waste. To think and not study is dangerous.

Pagina: 1