Ik zou graag een ORDER BY RAND() uit willen voeren in een query; echter zou ik het een stuk prettiger vinden als de volgorde niet bij elke query verandert, maar bijvoorbeeld per uur of dag ofzo... Iemand énig idee welke richting ik op moet denken om dit te realiseren?!
Ik neem aan dat je php gebruikt.
Dus je doet een case, of een if, waarin je voor iedere 24 uur van de dag een andere query defineert?
Dus je doet een case, of een if, waarin je voor iedere 24 uur van de dag een andere query defineert?
Going for adventure, lots of sun and a convertible! | GMT-8
Je kunt gewoon de dag/uur meegeven als seed. Dus dan wordt het
Trwns, je kunt natuurlijk ook met je maand en jaar vermenigvuldigen om het nog meer random te houden op lange termijn.
SQL:
1
| ORDER BY RAND(DAY(NOW())) |
Trwns, je kunt natuurlijk ook met je maand en jaar vermenigvuldigen om het nog meer random te houden op lange termijn.
[ Voor 49% gewijzigd door Pete op 04-09-2007 17:56 ]
Merk op dat het gedrag van RAND nogal verschilt tussen versies. Let op welke versie je hebt. Zie de handleiding.
My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant
Of maak een 'tussenbestand' die je ieder uur genereert, afhankelijk hoeveel data je hebt kan het behoorlijk in performance schelen. Een soort van eigen cache implementatie.
Digitaal onderwijsmateriaal, leermateriaal voor hbo
Op basis waarvan sorteert hij dan? SELECT RAND() levert 0.2434543252 o.i.d. op. Als ik handmatig ORDER BY 0.456234 doe dan doet de query het niet. Wat me ook opvalt is dat ORDER BY RAND() de performance behoorlijk naar beneden haalt, dus ORDER BY RAND(DAY(NOW())) is dan helemaal traag...phsmit schreef op dinsdag 04 september 2007 @ 17:51:
Trwns, je kunt natuurlijk ook met je maand en jaar vermenigvuldigen om het nog meer random te houden op lange termijn.
Tussenbestand? Hoe kun je dat gebruiken bij je sorteervolgorde? (beetje zelfde vraag eigenlijk als die hierboven)gorgi_19 schreef op dinsdag 04 september 2007 @ 18:01:
Of maak een 'tussenbestand' die je ieder uur genereert, afhankelijk hoeveel data je hebt kan het behoorlijk in performance schelen. Een soort van eigen cache implementatie.
Als je geen ORDER BY opgeeft is'ie in principe al random he. Eventueel zou je dan nog iets van array_shuffle er daarna op los kunnen laten.
Als je echt een random orde wilt die per uur / dag verandert kun je denk ik nog het snelst een extra kolom `order` toevoegen en elke tijdseenheid iets van update table set `order` = RAND() doen
Gooi je vervolgens een index op die order kolom vermoed ik dat je query relatief niet zo gek veel langzamer zal zijn dan een gewone select
Als je echt een random orde wilt die per uur / dag verandert kun je denk ik nog het snelst een extra kolom `order` toevoegen en elke tijdseenheid iets van update table set `order` = RAND() doen
[ Voor 17% gewijzigd door FragFrog op 04-09-2007 18:51 ]
Zonder ORDER BY houdt ie toch gewoon de volgorde aan waarin de records aan de database zijn toegevoegd? Of randomized ie 'm toch nog?FragFrog schreef op dinsdag 04 september 2007 @ 18:50:
Als je geen ORDER BY opgeeft is'ie in principe al random he.
Dat idee van die random kolom lijkt me de beste methode. Bedankt!
Bij een query zonder order by clause of een order by op een non unique veld garandeerd de database geen bepaalde volgorde, dat is natuurlijk iets anders dan een random selectie uit je datasetVerwijderd schreef op dinsdag 04 september 2007 @ 19:09:
[...]
Zonder ORDER BY houdt ie toch gewoon de volgorde aan waarin de records aan de database zijn toegevoegd? Of randomized ie 'm toch nog?
Dat idee van die random kolom lijkt me de beste methode. Bedankt!
Voer gewoon 1x per uur een ORDER BY RAND() uit en sla die resultaten op in een bestand. Na een uur vervang je het bestand. Zo heb je een willekeurige volgorde per uur en je hebt geen enorme performance hog gecreeerd op je database.Verwijderd schreef op dinsdag 04 september 2007 @ 18:37:
Tussenbestand? Hoe kun je dat gebruiken bij je sorteervolgorde? (beetje zelfde vraag eigenlijk als die hierboven)
Digitaal onderwijsmateriaal, leermateriaal voor hbo
Zoals mijn query sorteert hij random. Maar omdat je een seed toevoegt (day(now()) of watyoulike) blijft de volgorde gedurende de hele dag gelijk. De volgende dag is de seed anders en is de sortering dus anders.Verwijderd schreef op dinsdag 04 september 2007 @ 18:37:
[...]
Op basis waarvan sorteert hij dan? SELECT RAND() levert 0.2434543252 o.i.d. op. Als ik handmatig ORDER BY 0.456234 doe dan doet de query het niet. Wat me ook opvalt is dat ORDER BY RAND() de performance behoorlijk naar beneden haalt, dus ORDER BY RAND(DAY(NOW())) is dan helemaal traag...
Over traag gesproken: ik weet niet hoe jij je query wil gaan gebruiken en waar. Met de informatie die je gegeven hebt heb ik de eleganste oplossing bedacht. Als je het performanter wil zou je een veld "sorteervolgorde" aan je tabel kunnen toevoegen en hier een index opzetten. Daarna kun je dan ieder uur de volgende query uitvoeren:
SQL:
1
| UPDATE `tabel` SET sorteervolgorde = RAND() |
Dat zei ik net ookalphsmit schreef op dinsdag 04 september 2007 @ 22:58:
Over traag gesproken: ik weet niet hoe jij je query wil gaan gebruiken en waar. Met de informatie die je gegeven hebt heb ik de eleganste oplossing bedacht. Als je het performanter wil zou je een veld "sorteervolgorde" aan je tabel kunnen toevoegen en hier een index opzetten. Daarna kun je dan ieder uur de volgende query uitvoeren:
SQL:
1 UPDATE `tabel` SET sorteervolgorde = RAND()
Ben het wel met twiekert eens trouwens dat cachen beter is dan een extra tabel toevoegen en dat weer sneller is dan order by RAND(time-based-seed), hangt van de situatie af wat je wil en kan gebruiken
Hoe kan ik die selectie randomizen? Immers, als ik RAND() in een query heb zitten, zal MySQL de query niet cachen....twiekert schreef op dinsdag 04 september 2007 @ 22:41:
Ik zou een random selectie elk uur ophalen en cachen ipv een random kolom toevoegen.
MySQL cached die resultset ook niet, dat doe je op de server; in memory of in een bestand.Verwijderd schreef op maandag 17 september 2007 @ 17:23:
[...]
Hoe kan ik die selectie randomizen? Immers, als ik RAND() in een query heb zitten, zal MySQL de query niet cachen....
Digitaal onderwijsmateriaal, leermateriaal voor hbo
Bedoel je dat ik de $result in het geval van:gorgi_19 schreef op maandag 17 september 2007 @ 17:31:
[...]
MySQL cached die resultset ook niet, dat doe je op de server; in memory of in een bestand.
PHP:
1
| $result = mysql_query("SELECT * FROM foo ORDER BY RAND()"); |
op de één of andere manier in PHP kan opslaan om die op een later tijdstip weer te gebruiken?
Je weet ook hoe je ze uiteindelijk op het scherm afdrukt toch? Waarom zou het nu ineens rocket sciense worden om diezelfde gegevens in een bestandje oid te zetten?
Ff een tip: Nee, er is niet een serialize($result) achtige functie. Soms moet je de dingen inderdaad zelf uitprogrammeren
.
Ff een tip: Nee, er is niet een serialize($result) achtige functie. Soms moet je de dingen inderdaad zelf uitprogrammeren
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
In PHP opslaan zal niet helemaal makkelijk gaan. PHP heeft namelijk geen Applicatiescope, dus andere requests zullen er niet bij kunnen.
Wat wel waarschijnlijk is, dat jouw data onderdeel is van een templateblokje. Als je dus gewoon je templateblokje cachet (is opslaan in file) hoef je niet iedere keer de query uit te voeren.
Trouwens, heb je wel een test gedaan of het echt langzaam is (eerder genoemde query's)? Er bestaat namelijk een gezegde "Premature optimization is the root of all evil"
Wat wel waarschijnlijk is, dat jouw data onderdeel is van een templateblokje. Als je dus gewoon je templateblokje cachet (is opslaan in file) hoef je niet iedere keer de query uit te voeren.
Trouwens, heb je wel een test gedaan of het echt langzaam is (eerder genoemde query's)? Er bestaat namelijk een gezegde "Premature optimization is the root of all evil"
Nou wellicht zit ik helemaal in de verkeerde richting te denken. Ik snap werkelijk niet hoe je een result-set in een bestandje op zou kunnen slaan? Bedoel je dat ik de variabele $result in een MEMCACHE op zou kunnen slaan om die vervolgens in latere parsings weer te gebruiken?Janoz schreef op maandag 17 september 2007 @ 18:02:
Je weet ook hoe je ze uiteindelijk op het scherm afdrukt toch? Waarom zou het nu ineens rocket sciense worden om diezelfde gegevens in een bestandje oid te zetten?
Ff een tip: Nee, er is niet een serialize($result) achtige functie. Soms moet je de dingen inderdaad zelf uitprogrammeren.
De totale parse-tijd neemt met factor 2 toe! (querytijd met factor 30) Lijkt me dus wel de moeite waard...phsmit schreef op maandag 17 september 2007 @ 18:04:
Trouwens, heb je wel een test gedaan of het echt langzaam is (eerder genoemde query's)? Er bestaat namelijk een gezegde "Premature optimization is the root of all evil"
Nee, dat is nu juist net wat ik niet bedoel en wat ik in de tip aangeef.Verwijderd schreef op maandag 17 september 2007 @ 18:06:
Bedoel je dat ik de variabele $result in een MEMCACHE op zou kunnen slaan om die vervolgens in latere parsings weer te gebruiken?
Je hebt zelf code geschreven die de resultset uitleest en op het scherm zet. Wat is nu het grote verschil tussen iets wegschrijven op een html pagina aan de ene kant en het uitlezen van een resultset en dat wegschrijven naar een bestandje (of eventueel memcache) aan de andere kant?
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Performance?Janoz schreef op maandag 17 september 2007 @ 18:12:
[...]
Wat is nu het grote verschil tussen iets wegschrijven op een html pagina aan de ene kant en het uitlezen van een resultset en dat wegschrijven naar een bestandje (of eventueel memcache) aan de andere kant?
Of je nu HTML genereert en deze in de outputstream stopt of deze wegschrijft naar een bestand (en dus in een filestream stopt); wat is het degelijke verschil? In principe niets
Digitaal onderwijsmateriaal, leermateriaal voor hbo
OOHHHHHHHHHHHHHHH... je bedoelt de html an sich wegschrijven... Tsjah... dat snap ik dan welgorgi_19 schreef op maandag 17 september 2007 @ 18:32:
[...]
Of je nu HTML genereert en deze in de outputstream stopt of deze wegschrijft naar een bestand (en dus in een filestream stopt); wat is het degelijke verschil? In principe niets
Bedankt voor jullie hulp! Ik ga na alles overwogen te hebben toch voor een van de eerder genoemde opties; de extra sorteerkolom.
Pagina: 1