Avatar billede jtp Nybegynder
10. marts 2003 - 23:20 Der 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.

På forhånd tak.


/jtp
Avatar billede mortrr Praktikant
10. marts 2003 - 23:27 #1
Noget lignende:

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å.
Avatar billede jtp Nybegynder
10. marts 2003 - 23:37 #2
Tak for dit hurtige svar, mortrr, men det løser desværre ikke mit problem. Jeg får denne fejl:

---klip-----------
ADODB.Recordset.1 error '80004005'

SQLState: S1000
Native Error Code: 1111
[TCX][MyODBC]Invalid use of group function
---klip-----------
Avatar billede mortrr Praktikant
10. marts 2003 - 23:54 #3
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
Avatar billede jtp Nybegynder
10. marts 2003 - 23:56 #4
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
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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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