Gå til innhold

hjelp til komplisert? select-query (sql)


Anbefalte innlegg

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

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

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

Å 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
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? :dontgetit:

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...