Gå til innhold

Anbefalte innlegg

Ø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
Videoannonse
Annonse

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 av MikkelRev
Lenke til kommentar

Ø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

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 av pianoforte
Lenke til kommentar

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
  • 3 uker senere...

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...