catoha Skrevet 3. mars 2008 Del Skrevet 3. mars 2008 Hei folkens. Jeg trenger litt bistand. Har følgende spørring i dag: SELECT turAar, turID, sptTurID, syklistFornavn, syklistEtternavn, syklistID, sptSyklistID, COUNT(sptSyklistID) as deltakelser FROM mck_syklist_pa_tur, mck_syklist, mck_tur WHERE sptSyklistID = syklistID AND sptTurID = turID AND turAar = $Aar AND turRunde = $ForrigeRunde GROUP BY sptSyklistID ORDER BY deltakelser DESC Hva jeg gjør er at jeg henter ut antall deltakelser til en syklist, hvor jeg teller hvor mange ganger hans ID inntreffer for en gitt sykkelrunde (periode på noen uker). Problemet er ikke å hente den med høyest deltakelse. Det gjør jeg greit med å sortere etter deltakelser. Men: om 2 eller flere har like mange deltakelser, så ønsker jeg å dra ut de, og ikke alle de andre. Har tenkt å benytte denne MAX funksjonen, men sliter litt. Noen som har noen gode forslag til hvordan dette kan løses? Takker for all hjelp Lenke til kommentar
G2Petter Skrevet 3. mars 2008 Del Skrevet 3. mars 2008 Mener du at dersom det bare er én som har flest deltagelser skal du hente ut alle sortert, og hvis det er to eller flere skal du kun hente ut de, eller skal du uansett bare ha ut den/de med flest? Hvis det er det siste tror jeg det skal gå med max(count(sptSyklistID)) Lenke til kommentar
catoha Skrevet 3. mars 2008 Forfatter Del Skrevet 3. mars 2008 (endret) Mener du at dersom det bare er én som har flest deltagelser skal du hente ut alle sortert, og hvis det er to eller flere skal du kun hente ut de, eller skal du uansett bare ha ut den/de med flest? Hvis det er det siste tror jeg det skal gå med max(count(sptSyklistID)) Hei, jeg har forsøkt litt med denne max(count(sptSyklistID)), men får en feilmelding (#1111 - Invalid use of group function ). Antagelig knyttet til at jeg har en GROUP BY funksjon senere i spørringen. Helt riktig at jeg kun ønsker å hente du den/de som har mest poeng... Endret 4. mars 2008 av catoha Lenke til kommentar
catoha Skrevet 10. mars 2008 Forfatter Del Skrevet 10. mars 2008 Ingen som ønsker å prøve seg på dette lille utfordringen? Lenke til kommentar
G2Petter Skrevet 10. mars 2008 Del Skrevet 10. mars 2008 (endret) Nå vet jeg ikke hvordan de forskjellige tabellene dine er satt opp, så jeg klarer ikke helt å forstå alt som skjer, men du kan forsøke deg med noe som ligner litt på denne pseudokoden(jeg har ikke tatt med alle kolonnene du trenger): SELECT navn, MAX(deltakelser) AS max_deltakelser FROM den_tabellen_som_har_sptSyklistID WHERE deltakelser IN (SELECT COUNT(sptSyklistID) AS deltakelser bla bla bla); Poenget er at den andre spørringen skal gi deg en liste over antall deltagelser, og den første skal gi deg bare den/de som har flest. Endret 10. mars 2008 av G2Petter Lenke til kommentar
JohndoeMAKT Skrevet 10. mars 2008 Del Skrevet 10. mars 2008 Hva er målet ditt? ( I normal tale ) Hvordan er strukturen på tabellene dine? Lenke til kommentar
catoha Skrevet 10. mars 2008 Forfatter Del Skrevet 10. mars 2008 Nå vet jeg ikke hvordan de forskjellige tabellene dine er satt opp, så jeg klarer ikke helt å forstå alt som skjer, men du kan forsøke deg med noe som ligner litt på denne pseudokoden(jeg har ikke tatt med alle kolonnene du trenger): SELECT navn, MAX(deltakelser) AS max_deltakelser FROM den_tabellen_som_har_sptSyklistID WHERE deltakelser IN (SELECT COUNT(sptSyklistID) AS deltakelser bla bla bla); Poenget er at den andre spørringen skal gi deg en liste over antall deltagelser, og den første skal gi deg bare den/de som har flest. Skal prøve meg på denne... Kan også poste de ulike tabellene jeg har får en bedre oversikt. Lenke til kommentar
catoha Skrevet 10. mars 2008 Forfatter Del Skrevet 10. mars 2008 Forsøkte meg på denne spørringen: SELECT `sptSyklistID`, MAX(`deltakelser`) AS `max_deltakelser` FROM `mck_syklist_pa_tur` WHERE `deltakelser` IN (SELECT COUNT(`sptSyklistID`) AS `deltakelser` FROM `mck_syklist_pa_tur`, `mck_syklist` WHERE `syklistID` = `sptSyklistID`); men fikk følgende feil: #1054 - Unknown column 'deltakelser' in 'field list' -------------------------------------------- For dere som lurer litt på strukturen, så er den som følger: -- Tabellstruktur for tabell `mck_syklist_pa_tur` `sptSyklistID` `sptTurID` `sptKlatrePlassering` `sptSpurtPlassering` `sptKlatrePoeng` `sptSpurtPoeng` ------------------- -- Tabellstruktur for tabell `mck_syklist` `syklistID` `syklistFornavn` `syklistEtternavn` ------------------- Det er naturligvis flere tabeller, men ikke som er relevante slik jeg ser det. I klartekst ønsker jeg å telle opp hvor mange ganger en sptSyklistID dukker opp i den øverste tabellen for en gitt periode ( dette krysses med en turtabell som inne holder info som dato, år etc. ). Det å få tak i DEN ene som har flest deltakelser er ikke så vanskelig, men i de tilfeller hvor flere sptSyklistID har vært med på like mange turer for den gitte perioden, så ønsker jeg å hente ut KUN de med flest deltakelser. Håper dette var oppklarende. Lenke til kommentar
G2Petter Skrevet 10. mars 2008 Del Skrevet 10. mars 2008 Prøv å droppe aliaset: SELECT `sptSyklistID`, MAX(`deltakelser`) AS `max_deltakelser` FROM `mck_syklist_pa_tur` WHERE `sptSyklistID` IN (SELECT COUNT(`sptSyklistID`) FROM `mck_syklist_pa_tur`, `mck_syklist` WHERE `syklistID` = `sptSyklistID`); Fremgangsmåten din bør være at du først får den "indre" spørringen til å gi deg det resultatet du vil ha. I ditt tilfelle regner jeg med at det bør være antall deltagelser og id. Når du har det kan du putte på den "ytre" delen av spørringen. Lenke til kommentar
catoha Skrevet 10. mars 2008 Forfatter Del Skrevet 10. mars 2008 Prøv å droppe aliaset: SELECT `sptSyklistID`, MAX(`deltakelser`) AS `max_deltakelser` FROM `mck_syklist_pa_tur` WHERE `sptSyklistID` IN (SELECT COUNT(`sptSyklistID`) FROM `mck_syklist_pa_tur`, `mck_syklist` WHERE `syklistID` = `sptSyklistID`); Fremgangsmåten din bør være at du først får den "indre" spørringen til å gi deg det resultatet du vil ha. I ditt tilfelle regner jeg med at det bør være antall deltagelser og id. Når du har det kan du putte på den "ytre" delen av spørringen. #1140 - Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause Denne erroren fikk jeg får denne spørringen: SELECT `sptSyklistID` , MAX( `sptSyklistID` ) AS `max_deltakelser` FROM `mck_syklist_pa_tur` WHERE `sptSyklistID` IN ( SELECT COUNT( `sptSyklistID` ) FROM `mck_syklist_pa_tur` , `mck_syklist` WHERE `syklistID` = `sptSyklistID` ) Er med på hva du mener... Lenke til kommentar
G2Petter Skrevet 10. mars 2008 Del Skrevet 10. mars 2008 Det glemte jeg: hver gang du bruker en aggregatfunksjon, som count, max etc. må du skrive GROUP BY på alle kolonnene du ikke bruker aggregatfunksjon. Eksempel: SELECT col1, col2 count(col3) FROM table1 GROUP BY col1, col2 Skjønner? Lenke til kommentar
catoha Skrevet 10. mars 2008 Forfatter Del Skrevet 10. mars 2008 Det glemte jeg: hver gang du bruker en aggregatfunksjon, som count, max etc. må du skrive GROUP BY på alle kolonnene du ikke bruker aggregatfunksjon. Eksempel: SELECT col1, col2 count(col3) FROM table1 GROUP BY col1, col2 Skjønner? hmm.. ja har oppdaget noe slikt.. Den indre funker nå: SELECT `sptSyklistID`, COUNT( `sptSyklistID` ) AS `deltakelser` FROM `mck_syklist_pa_tur` , `mck_syklist` WHERE `syklistID` = `sptSyklistID` GROUP BY `sptSyklistID` så får vi se om jeg får til den ytre også. Lenke til kommentar
catoha Skrevet 10. mars 2008 Forfatter Del Skrevet 10. mars 2008 forsøkte meg på denne: SELECT `sptSyklistID` , MAX( `deltakelser` ) AS `max_deltakelser` FROM `mck_syklist_pa_tur` WHERE `deltakelser` IN ( SELECT `sptSyklistID`, COUNT( `sptSyklistID` ) AS `deltakelser` FROM `mck_syklist_pa_tur` , `mck_syklist` WHERE `syklistID` = `sptSyklistID` GROUP BY `sptSyklistID`) GROUP BY `sptSyklistID` Fikk følgende feil: #1054 - Unknown column 'deltakelser' in 'field list' Lenke til kommentar
G2Petter Skrevet 10. mars 2008 Del Skrevet 10. mars 2008 Da vet jeg ikke. Det kan hende at det ikke er mulig å overføre aliaset fra den indre spørringen til den ytre, og i så fall kommer jeg ikke på noen god måte å gjøre det på. Det er sikkert mulig, og det kan hende det er lettere enn det vi har prøvd på nå. Lenke til kommentar
catoha Skrevet 10. mars 2008 Forfatter Del Skrevet 10. mars 2008 Da vet jeg ikke. Det kan hende at det ikke er mulig å overføre aliaset fra den indre spørringen til den ytre, og i så fall kommer jeg ikke på noen god måte å gjøre det på. Det er sikkert mulig, og det kan hende det er lettere enn det vi har prøvd på nå. I denne spørringen: SELECT `sptSyklistID`, MAX( `deltakelser` ) AS `max_deltakelser` FROM ( SELECT `sptSyklistID`, COUNT( `sptSyklistID` ) AS `deltakelser` FROM `mck_syklist_pa_tur` , `mck_syklist` WHERE `syklistID` = `sptSyklistID` GROUP BY `sptSyklistID`) AS `syklister` GROUP BY `sptSyklistID` fikk jeg ut følgende: sptSyklistID max_deltakelser 1 9 10 1 2 6 3 4 4 4 5 5 6 4 7 4 9 1 Altså fikk jeg ut alt. Den tok ikke MAX deltakelser av en eller annen grunn. Noen idè? Lenke til kommentar
catoha Skrevet 10. mars 2008 Forfatter Del Skrevet 10. mars 2008 Nei, dessverre ikke. Takker uansett for at du tok deg bryet med å tenke litt høyt sammen med meg.. Andre som har en mulig løsning her? Lenke til kommentar
catoha Skrevet 14. april 2008 Forfatter Del Skrevet 14. april 2008 (endret) Endret 14. april 2008 av catoha Lenke til kommentar
Kul drittunge Skrevet 23. april 2008 Del Skrevet 23. april 2008 (endret) Du kan vel gjøre det såpass enkelt som at du kjører spørringen to ganger og joiner den med seg selv. Eventuelt legge resultatsettet fra den første spørringen inn i en midlertidig tabell. select * from ( select 1 as id union all select 2 as id ) as sub inner join ( select 1 as id ) as dub on dub.id = sub.id Endret 23. april 2008 av zY8pKPhR8XLJ 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å