pianoforte Skrevet 21. mars 2010 Del Skrevet 21. mars 2010 Ønsker en spørring som henter ut x tilfeldige blant de y siste postene i en MySQL-tabell. For eksempel kan jeg ha spørringen: SELECT * FROM table ORDER BY id DESC LIMIT 100 Men jeg vil bare hente ut 10 tilfeldige av disse. Blir jeg nødt til å hente ut 100 og så velge 10 tilfeldige i PHP el.? Lenke til kommentar
MikkelRev Skrevet 21. mars 2010 Del Skrevet 21. mars 2010 (endret) Denne spørringen henter ut ti tilfeldige steder i Hordaland i tabellen norge (id,sted,fylke): SELECT * FROM norge WHERE id IN ( SELECT id FROM norge WHERE fylke='Hordaland' ) ORDER BY RAND() LIMIT 10 Har prøvd å bytte ut WHERE fylke= med LIMIT 100, men "Error Code 1235: This version of MySQL doesn't yet support LIMIT & IN/ALL/ANY/SOME subquery." Kan du bruke andre kriterier enn hundre siste, som feks siste syv dager? En annen mulighet er å bruke utsnitt. CREATE VIEW hundresiste AS ... Endret 22. mars 2010 av MikkelRev Lenke til kommentar
Ueland Skrevet 23. mars 2010 Del Skrevet 23. mars 2010 Ønsker en spørring som henter ut x tilfeldige blant de y siste postene i en MySQL-tabell. For eksempel kan jeg ha spørringen: SELECT * FROM table ORDER BY id DESC LIMIT 100 Men jeg vil bare hente ut 10 tilfeldige av disse. Blir jeg nødt til å hente ut 100 og så velge 10 tilfeldige i PHP el.? SELECT * FROM table ORDER BY RAND() LIMIT 10 Lenke til kommentar
TheClown Skrevet 23. mars 2010 Del Skrevet 23. mars 2010 Gjør det heller med php, rand i mysql er en dårlig løsning Lenke til kommentar
Jonas Skrevet 23. mars 2010 Del Skrevet 23. mars 2010 [..] Den spørringen vil hente ut 10 tilfeldige rader, men trådstarter er ute etter 10 tilfeldige av de 100 siste. Lenke til kommentar
pianoforte Skrevet 25. mars 2010 Forfatter Del Skrevet 25. mars 2010 (endret) Takk for svar. MikkelRev sitt forslag ledet meg til følgende løsning (som krever to spørringer): SET @i = 0; SELECT id FROM table WHERE id IN (SELECT id FROM table WHERE (@i := (@i + 1)) <= 100 ORDER BY id DESC) ORDER BY RAND() LIMIT 10; Er dette lite effektivt? Vil jeg spare mye ressurser på å heller basere meg på en "vanlig" WHERE, basert på tid eller noe, i IN() (som MikkelRev beskriver)? Endret 25. mars 2010 av pianoforte Lenke til kommentar
quantum Skrevet 25. mars 2010 Del Skrevet 25. mars 2010 Gjør det heller med php, rand i mysql er en dårlig løsning da må du vel enten få over alle postene du skal gjøre utvalg blant, og så foreta utvalget, eller velge blant utvalget av eksisterende pk'er og så gjøre nye kall for å hente resten av dataene? Akkurat hva er fordelen med å gjøre det så tungvint? Lenke til kommentar
alfred97 Skrevet 11. april 2010 Del Skrevet 11. april 2010 da må du vel enten få over alle postene du skal gjøre utvalg blant, og så foreta utvalget, eller velge blant utvalget av eksisterende pk'er og så gjøre nye kall for å hente resten av dataene? Akkurat hva er fordelen med å gjøre det så tungvint? Jeg tror man trygt kan bruke RAND() i dette tilfellet, forutsatt at det alltid vil være et begrenset antall poster man skal velge blant (de 100 siste). Dersom en derimot skulle hente ut rader fra hele tabellen og ikke bare et begrenset utvalg, vil det finnes en god begrunnelse for å gjøre utvalget i PHP, slik TheClown foreslår. Stikkordene er ytelse og skalerbarhet. Hvis du drar en select med order by rand(), så må database-enginen utføre en rand() for hver eneste rad i tabellen, sortere på denne verdien og deretter returnere et gitt antall rader. Da er det bedre å spørre ut antallet rader A først, velge et tilfeldig tall R mellom 1 og A, og til slutt spørre ut forekomster med limit R,1 eller noe sånt. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå