Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[MySQL] ORDER BY RAND() -> per uur/dag/etc!

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

Verwijderd

Topicstarter
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?!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

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?

Going for adventure, lots of sun and a convertible! | GMT-8


  • Pete
  • Registratie: November 2005
  • Laatst online: 31-10 12:38
Je kunt gewoon de dag/uur meegeven als seed. Dus dan wordt het
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 ]

petersmit.eu


  • ATS
  • Registratie: September 2001
  • Laatst online: 28-11 20:56

ATS

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


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:16

gorgi_19

Kruimeltjes zijn weer op :9

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


Verwijderd

Topicstarter
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.
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...
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.
Tussenbestand? Hoe kun je dat gebruiken bij je sorteervolgorde? (beetje zelfde vraag eigenlijk als die hierboven)

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 21:07
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 :)

[ Voor 17% gewijzigd door FragFrog op 04-09-2007 18:51 ]

[ Site ] [ twitch ] [ jijbuis ]


Verwijderd

Topicstarter
FragFrog schreef op dinsdag 04 september 2007 @ 18:50:
Als je geen ORDER BY opgeeft is'ie in principe al random he.
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!

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 28-11 20:18
Verwijderd 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!
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 dataset :). Ik zou een random selectie elk uur ophalen en cachen ipv een random kolom toevoegen.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:16

gorgi_19

Kruimeltjes zijn weer op :9

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)
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.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Pete
  • Registratie: November 2005
  • Laatst online: 31-10 12:38
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...
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.

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()

petersmit.eu


  • FragFrog
  • Registratie: September 2001
  • Laatst online: 21:07
phsmit 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()
Dat zei ik net ookal ;)

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 :)

[ Site ] [ twitch ] [ jijbuis ]


Verwijderd

Topicstarter
twiekert schreef op dinsdag 04 september 2007 @ 22:41:
Ik zou een random selectie elk uur ophalen en cachen ipv een random kolom toevoegen.
Hoe kan ik die selectie randomizen? Immers, als ik RAND() in een query heb zitten, zal MySQL de query niet cachen....

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:16

gorgi_19

Kruimeltjes zijn weer op :9

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....
MySQL cached die resultset ook niet, dat doe je op de server; in memory of in een bestand.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
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.
Bedoel je dat ik de $result in het geval van:

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?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 30-11 11:35

Janoz

Moderator Devschuur®

!litemod

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 ;).

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Pete
  • Registratie: November 2005
  • Laatst online: 31-10 12:38
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"

petersmit.eu


Verwijderd

Topicstarter
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 ;).
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?

Verwijderd

Topicstarter
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"
De totale parse-tijd neemt met factor 2 toe! (querytijd met factor 30) Lijkt me dus wel de moeite waard...

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 30-11 11:35

Janoz

Moderator Devschuur®

!litemod

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?
Nee, dat is nu juist net wat ik niet bedoel en wat ik in de tip aangeef.

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'


Verwijderd

Topicstarter
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?
Performance?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:16

gorgi_19

Kruimeltjes zijn weer op :9

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


Verwijderd

Topicstarter
gorgi_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 :)
OOHHHHHHHHHHHHHHH... je bedoelt de html an sich wegschrijven... Tsjah... dat snap ik dan wel :D Ik dacht dat je bedoelde om de variabele $result op de een of andere manier te bewaren...

Bedankt voor jullie hulp! Ik ga na alles overwogen te hebben toch voor een van de eerder genoemde opties; de extra sorteerkolom.
Pagina: 1