Gå til innhold

SQL spørring: Count og MAX sammen. Noen gode forslag?


Anbefalte innlegg

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

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

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

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

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

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

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
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
  • 1 måned senere...
  • 2 uker senere...

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