Avatar billede Goose Juniormester
15. august 2019 - 09:48 Der er 8 kommentarer og
1 løsning

Count fra anden tabel

Hejsa, jeg er forholdvis ny i MySQL, og står over for en lille udfordring.

Jeg har en tabel (kursus_tilmelding) som bl.a. indeholder følgende felter:
id
kursusnr

I en anden tabel (kursus_tilmelding_order) har jeg så dem der har tilmeldt sig de enkelte kurser og den indeholder følgende felter:
id
kursusid (som kommer fra id i kursus_tilmelding)
navn

Nu vil jeg så gerne lave et udtræk af alle kurser med en sammentælling af hvor mange der er tilmeldt hver enkelt kursus, og det gør jeg med følgende:

SELECT
kursus_tilmelding.kursusnr,
COUNT(kursustilmelding_order.kursusid) AS TOTAL
FROM kursus_tilmelding
INNER JOIN kursustilmelding_order
ON kursustilmelding_order.kursusid = kursus_tilmelding.id
GROUP BY kursus_tilmelding.kursusnr

Udfordringen i ovenstående er bare, at de kurser hvor der ikke er nogle tilmeldte, de kommer ikke med ud på listen og det skal de - blot med med 0 som TOTAL

Hvordan hulen løser jeg det?
Avatar billede Slater Ekspert
15. august 2019 - 10:35 #1
En "inner join" er specifikt en join, hvor du kun får resultaterne der findes i begge tabeller. Det lyder som om du bare skal udskifte den med en "left join", som er en hvor resultatet findes i den venstre tabel - altså den der står før din join.
Avatar billede Goose Juniormester
15. august 2019 - 12:21 #2
Fantastisk, det ser ud til at fungerer :)

Hvis jeg nu tilføjer et ekstra felt til tabellen (kursus_tilmelding_order) som en INT hvor 0 = ikke godkent og 1= godkendt, hvad skal jeg så ændre for at den kun tæller dem som er godkendt, altså hvor værdien =1 ?
Avatar billede Slater Ekspert
15. august 2019 - 13:03 #3
Så tilføjer du bare en "where nytfelt=1"
Avatar billede Goose Juniormester
15. august 2019 - 13:39 #4
Ja det troede jeg jo også, men så får den ikke længere dem med hvor TOTAL = 0, med mindre det er fordi jeg sætter det ind et forkert sted?

Lige nu ser min query sådan her ud:

SELECT
kursus_tilmelding.kursusnr,
COUNT(kursustilmelding_order.kursusid) AS TOTAL
FROM kursus_tilmelding
LEFT JOIN kursustilmelding_order
ON kursustilmelding_order.kursusid = kursus_tilmelding.id
WHERE kursus_tilmelding_order.godkendt = 1
GROUP BY kursus_tilmelding.kursusnr
Avatar billede Slater Ekspert
15. august 2019 - 14:00 #5
Ah ha, du skal egentlig nok bruge "having" i stedet for "where", eftersom den skal aggregere resultatet. Husk having skal stå efter din group by i stedet for før, som where gør.

Jeg er dog lige på mobil lige nu og kan ikke teste, så hvis det ikke virker skal jeg nok svare bedre senere.
Avatar billede Goose Juniormester
15. august 2019 - 14:18 #6
Så får jeg følgende fejl:
Unknown column 'kursus_tilmelding_order.godkendt' in 'having clause'
(Fik lige pastet en forkert query ind i mit sidste opslag så der kommer lige en ny herunder)

SELECT
kursus_tilmelding.kursusnr,
COUNT(kursus_tilmelding_order.kursusid) AS TOTAL
FROM kursus_tilmelding
LEFT JOIN kursus_tilmelding_order
ON kursus_tilmelding_order.kursusid = kursus_tilmelding.id
GROUP BY kursus_tilmelding.kursusnr
HAVING kursus_tilmelding_order.godkendt=1
Avatar billede Goose Juniormester
15. august 2019 - 15:10 #7
Hmm, kan det hænge sammen med, at den ikke kan finde værdien "godkendt" på de kurser hvor der ikke er nogle tilmeldte, disse vil vel returnerer et null?

Beklager hvis det er et dumt spørgsmål, jeg er novice på det her felt ;)
Avatar billede arne_v Ekspert
15. august 2019 - 19:25 #8
Proev:

SELECT
kursus_tilmelding.kursusnr,
COUNT(kursustilmelding_order.kursusid) AS TOTAL
FROM kursus_tilmelding
LEFT JOIN kursustilmelding_order
ON (kursustilmelding_order.kursusid = kursus_tilmelding.id AND kursus_tilmelding_order.godkendt = 1)
GROUP BY kursus_tilmelding.kursusnr
Avatar billede Goose Juniormester
16. august 2019 - 14:54 #9
Fantastisk - det fungerer lige som det skal :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester