Gå til innhold

Anbefalte innlegg

Jeg skal sjekke de 5 siste som er logget inn på en side og har derfor en tabell (login) som inneholder følgende informasjon:

 

id | epost |

---------------

10 | epost1 |

9 | epost1 |

8 | epost1 |

7 | epost5 |

6 | epost5 |

5 | epost4 |

4 | epost2 |

osv

 

Når jeg prøver meg med:

"select epost from login order by id desc limit 5" får jeg ut:

epost1, epost1, epost1, epost5, epost5, noe som er helt riktig.

 

men, når jeg bare vil ha ulike rader, bruker jeg:

"select distinct epost from login order by id desc limit 5" får jeg ut:

epost5, epost2, osv. nedover i tabellen. Det virker som MySQL hopper vilkårlig over rader i tabellen...

 

Noen ideer?

 

PS. Vakke så lett å forklare problemet.

Lenke til kommentar
  • 2 uker senere...
Videoannonse
Annonse

Jeg mener å ha lest før en plass at mySQL har problemer med distinct - order by kombinasjoner, det er mulig det kan ha noe med det å gjøre. Husk at mySQL ikke implementerer mer enn ca 20% av iso-standarden for sql, så det hender at riktig sql kan få mysql til å oppføre seg rart.

 

Gir denne samme resultat? (nå er ikke jeg noen guru på sql, men jeg mener denne gjør samme jobben)

select epost from login 

   limit 5 

   order by id desc

   group by epost;

Lenke til kommentar
SELECT epost FROM login 

    ORDER BY id DESC

    GROUP BY epost

   LIMIT 0,5

 

Dette bør gje deg riktige resultat. Kunne du gjeve oss ein cut'n'paste frå utdataene? (Legg det i [ code]-tags, slik at formatteringa vert rett).

 

"You have an error in your SQL syntax near 'GROUP BY epost LIMIT 0,5'"

 

Men, jeg tror jeg har funnet problemet:

 

Tabellen min er bygget opp slik at den lager en linje i databasen for hver gang man logger inn på siden min. Siste innlogget vil derfor ha høyest ID i tabellen (derfor ORDER BY id DESC). Hvis jeg ikke har sagt det tidligere vil jeg vise de 5 siste som er logget inn på siden. Problemet med GROUP BY epost er at siden MySQL begynner i "bunnen" av tabellen, på lavest ID. epost'er som ligger lengre opp i tabellen bli borte fordi den eksisterer lengre ned i tabellen. Derfor vil den "hoppe over" noen epost'er i toppen av tabellen fordi de er allerede "funnet" av MySQL lengre ned (hvis dere skjønnte den???) Derfor, ingen god ide å bruke GROUP BY, så lenge jeg skal ha data'ene sortert synkende på ID...

 

Flere ideer tas imot med takk!

Lenke til kommentar

SELECT epost FROM login 

    GROUP BY epost

    ORDER BY id ASC

   LIMIT (COUNT(epost) - 5), 5

 

Det var ikkje verre enn at ORDER BY skal komme etter GROUP BY... :) Testa det lokalt her no, mot ein totalt annleis database, og det gav meg resultat som eg forventa. Det med LIMIT virkar ikkje, og du er nødt til å hente dette ut på forhånd, t.d. som "SELECT count(epost) FROM epost GROUP BY epost", og sette denne verdien inn i staden for "(COUNT(epost) - 5)", då skal det virke fint... :)

 

Litt uelegant å gjere det i to spørringar, men det BØR virke... :)

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