Gå til innhold

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


Anbefalte innlegg

Skrevet

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

Videoannonse
Annonse
Skrevet

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

Skrevet (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 av catoha
Skrevet (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 av G2Petter
Skrevet
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.

Skrevet

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.

Skrevet

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.

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

Skrevet

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?

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

Skrevet

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'

Skrevet

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

Skrevet
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è?

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

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

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