10. marts 2003 - 23:20Der er
3 kommentarer og 1 løsning
SELECT m. INNER JOIN og COUNT()
Jeg opererer med 4 forskellige tabeller:
users postnummer titel niveau
og har udarbejdet en SELECT-sætning med en del JOIN's:
SELECT users.*, postnummer.bynavn, titel.t_titel, niveau.n_niveau FROM users INNER JOIN postnummer ON (users.postnr = postnummer.postnr) INNER JOIN titel ON (users.titel = titel.t_ID) INNER JOIN niveau ON (users.niveau = niveau.n_ID) ORDER BY users.titel, users.fornavn, users.efternavn
Dette fungerer sådan set godt nok, men jeg vil gerne have mit rs ordnet efter en 5. faktor - nemlig antallet af gange brugeren har deltaget i et arrangement. Disse oplysninger ligger i en 5. tabel, der hedder [deltager_liste] og ser ud som følger:
================= deltager_liste ----------------- d_ID (primærnøgle) e_ID u_ID status =================
'status' indeholder enten værdien: 1, 2 eller 3, hvor 1 betyder, at brugeren har deltaget.
Jeg vil gerne have mit rs sorteret således, at den bruger, der har deltaget i flest arrangementer, står øverst. Kan dette lade sig gøre og givet fald hvordan?
Jeg har eksperimenteret lidt med 'COUNT(status) as Antal', men kan ikke få det til at fungerer i min eksisterende SELECT-sætning.
Håber der er nogen, der kan hjælpe en nybegynder :O)
Hvis ikke jeg har forklaret mig godt nok, så spørg og jeg skal forsøge at uddybe det.
SELECT users.id, users.titel, users.efternavn, users.fornavn, postnummer.bynavn, titel.t_titel, niveau.n_niveau, COUNT(Deltager_Liste.status) as AntalDeltaget FROM users INNER JOIN postnummer ON (users.postnr = postnummer.postnr) INNER JOIN titel ON (users.titel = titel.t_ID) INNER JOIN niveau ON (users.niveau = niveau.n_ID) LEFT JOIN Deltager_Liste ON (users.ID=Deltager_Liste.u_ID AND Deltager_Liste.status=1) group by users.id, users.titel, users.fornavn, users.efternavn, postnummer.bynavn, titel.t_titel, niveau.n_niveau ORDER BY COUNT(Deltager_Liste.status) DESC, users.titel, users.fornavn, users.efternavn
Jeg har brugt left join, så du også får dem med der ikke har deltaget. Brug INNER hvis de SKAL have deltaget.
Alle de felter du vil have med i din select eller order by, skal også med i group by. Undtagen det du tæller på.
Sorry - glemmer altid at mysql skal have det lidt anderledes. brug AntalDeltaget i order by: ORDER BY AntalDeltaget DESC, users.titel, users.fornavn, users.efternavn
Jep, har netop eksperimenteret lidt med det og fået det til at virke med denne SELECT-sætning:
---klip---------- SELECT users.*, postnummer.bynavn, titel.t_titel, niveau.n_niveau, count(Deltager_Liste.status) AS Antal FROM users INNER JOIN postnummer ON (users.postnr = postnummer.postnr) INNER JOIN titel ON (users.titel = titel.t_ID) INNER JOIN niveau ON (users.niveau = niveau.n_ID) INNER JOIN Deltager_Liste ON (users.ID = Deltager_Liste.u_ID AND Deltager_Liste.status=1) GROUP BY u_ID ORDER BY Antal DESC ---klip----------
Tak for hjælpen.
/jtp
Synes godt om
Ny brugerNybegynder
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.