emmet Skrevet 28. november 2007 Del Skrevet 28. november 2007 Hei. Sliter litt med en select-query fra en sqldatabase. Har radene id (løpernr), topicid (int), userid (int), score (int), status (varchar), timestamp (timestamp). Hver gang en bruker er inne på en topic blir det lagret en ny rad med oppdaterte opplysninger. Skal så hente ut alle topicid'er med status og score, hvor kun siste besøk (timestamp) skal vises. Noen som har peiling på hvordan en slik query skal utformes? Lenke til kommentar
Gjest Slettet+142 Skrevet 28. november 2007 Del Skrevet 28. november 2007 SELECT topicid, status, score FROM tabell ORDER BY timestamp DESC LIMIT 1 ? Lenke til kommentar
emmet Skrevet 28. november 2007 Forfatter Del Skrevet 28. november 2007 greit nok, men dette vil liste opp samme topicid mange ganger, og sorterer ikke ut i fra gitt bruker. jeg skal ha hver topicid kun en gang, og med status og score for det siste forsøket. skjønner? F.eks: (userid er gitt) topicid - status - score 1 - completed - 140 3 - incomplete - 100 5 - completed - 100 Lenke til kommentar
Gjest Slettet+142 Skrevet 28. november 2007 Del Skrevet 28. november 2007 hmm. vet ikke om jeg skjønner helt, men prøver en gang til jeg da SELECT topicid, status, score FROM `tabell` WHERE `userid`=1 GROUP BY `topicid` ORDER BY `timestamp` DESC LIMIT 1 Lenke til kommentar
emmet Skrevet 29. november 2007 Forfatter Del Skrevet 29. november 2007 Får feilmeldingene ORA-00979: not a GROUP BY expression og ORA-00933: SQL command not properly ended for henholdsvis group by og limit 1. det er en oracledatabase, hvis det hjelper? Lenke til kommentar
arex1337 Skrevet 29. november 2007 Del Skrevet 29. november 2007 hmm. vet ikke om jeg skjønner helt, men prøver en gang til jeg da SELECT topicid, status, score FROM `tabell` WHERE `userid`=1 GROUP BY `topicid` ORDER BY `timestamp` DESC LIMIT 1 Fjern fnuttene fra kolonnenavnene i alle fall: SELECT topicid, status, score FROM tabell WHERE userid=1 GROUP BY topicid ORDER BY timestamp DESC LIMIT 1 Lenke til kommentar
blackbrrd Skrevet 29. november 2007 Del Skrevet 29. november 2007 Å bruke GROUP BY uten aggregate functions fungerer heller dårlig Spørringen blir ikke pen og såvidt jeg kan forstå må du joine tabellen på seg selv, eller bruke en indre spørring SELECT topicid, status, score FROM tabell as a WHERE userid=1 AND id = (SELECT id FROM tabell as b WHERE a.topic = b.topic AND a.userid = b.userid ORDER BY b.timestamp DESC LIMIT 1) PS: selecten vil effektivt sett gå igjennom alle dataene lagret på en userid hver gang du kjører spørringen, så det kan lønne seg å legge inn en begrensning på hvor langt tilbake i tid du skal vise dataene. Lenke til kommentar
Gjest Slettet+142 Skrevet 30. november 2007 Del Skrevet 30. november 2007 hmm. vet ikke om jeg skjønner helt, men prøver en gang til jeg da SELECT topicid, status, score FROM `tabell` WHERE `userid`=1 GROUP BY `topicid` ORDER BY `timestamp` DESC LIMIT 1 Fjern fnuttene fra kolonnenavnene i alle fall: SELECT topicid, status, score FROM tabell WHERE userid=1 GROUP BY topicid ORDER BY timestamp DESC LIMIT 1 Hvorfor det? Jeg burde gjerne bruke fnutter på alle kolonnenavn når jeg først brukerpå ett, men.. Ellers må man vel bruke fnutter på navn som timestamp og date som er mysql-navn? Lenke til kommentar
tZar Skrevet 30. november 2007 Del Skrevet 30. november 2007 (endret) Edit: Never mind, ble mer eller mindre lik Blackbbrd sin spørring Endret 30. november 2007 av tZar 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å