Avatar billede razmuz_dk Nybegynder
19. oktober 2006 - 15:58 Der er 3 kommentarer og
1 løsning

GROUP BY problemer

Hej eksperter,

Jeg er løbet ind i et problem. Meningen med nedenstående query er, at den skal hive alle "gyms" plus deres tilhørende "bosser" (en employee med status = 'BOSS'). Herudover skal kaldet også COUNT'e hvor mange "normal ansatte" hvert "gym" har. Derfor bruger jeg en COUNT() og en GROUP BY på e2.gym_id. Men mysql group'er ikke som jeg ønsker det. I stedet for at returnere en række pr. center/boss, returneres i stedet en række pr. center - det er som om der også groupes på e.gym_id (og ikke kun på e2. gym_id). Kaldet ser sådan ud:
SELECT
    g.gym_id,
    g.name,
    e.employee_id,
    e.name employee_name,
    COUNT(e2.employee_id)
FROM gyms g
LEFT JOIN employees e ON e.gym_id = g.gym_id AND e.status = 'BOSS'
LEFT JOIN employees e2 ON e2.gym_id = g.gym_id AND e.status = 'NORMAL'
GROUP BY e2.gym_id
ORDER BY g.name

Jeg har som midlertidig løsning lavet et andet kald, som giver mig præcis det resultat jeg søger - men dette involverer desværre et sub-kald:
SELECT
    g.gym_id,
    g.name,
    e.employee_id,
    e.name employee_name,
    (SELECT COUNT(employee_id) FROM employees e2 WHERE e2.gym_id = g.gym_id AND e2.status = 'NORMAL') employees
FROM gyms g
LEFT JOIN employees e ON e.gym_id = g.gym_id AND e.status = 'BOSS'
ORDER BY g.name


Af performance-mæssige årsager vil jeg helst undgå dette sub-kald.

Kan I hjælpe mig? Hvad gør jeg forkert?

På forhånd tak.

Mvh
Rasmus
Avatar billede barklund Nybegynder
19. oktober 2006 - 16:16 #1
GROUP BY e2.gym_id, e.employee_id - du får dog samme count for alle bosser på samme gym - men er det også okay?
Avatar billede razmuz_dk Nybegynder
19. oktober 2006 - 18:27 #2
Arh på det led. Umiddelbart synes jeg det er ulogisk (jeg forstår "hvorfor det virker").

Men jeg mener bare at i og med jeg har defineret, at det kun er den ene tabel (e2) den skal group'e på, så burde det ikke være nødvendigt at skal fortælle den, at den skal group'e på e-tabellen primary-id. Kan du forklare det? Eller er det mig der lige skal tænke en ekstra gang over den? :-)

Men smid et svar og tak for hjælpen.
Avatar billede barklund Nybegynder
19. oktober 2006 - 21:07 #3
Dine joins bliver forlænget til "en lang række" - altså et antal rækker på den ene led. Som for eksempel:

gym_id | e2.gym_id | e2.employee_id | e.gym_id | e.employee_id
-------+-----------+----------------+----------+---------------
1      | 1        | 2              | 1        | 3
1      | 1        | 2              | 1        | 4
1      | 1        | 2              | 1        | 5
1      | 1        | 3              | 1        | 3
1      | 1        | 3              | 1        | 4
1      | 1        | 3              | 1        | 5

(det ser kun pænt ud i monospace dog, håber du forstår)

Efter dette sæt række bliver genereret fra dine joins, laver du så en join på e.gym_id - men da e.gym_id er lig e2.gym_id som er lig g.gym_id, så har det ingen betydning hvor du laver din gruppering - det har samme effekt. Efter du har joinet, skal du se alle søjler som var de søjler i den samme tabel.

Men ikke desto mindre et svar :)
Avatar billede barklund Nybegynder
20. oktober 2006 - 11:51 #4
Tark for points - håber du forstår logikken bag :)
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