15. august 2019 - 09:48Der 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
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.
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 ?
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
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.
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
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 ;)
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
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.