19. oktober 2006 - 15:58Der 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.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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? :-)
(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.
Tark for points - håber du forstår logikken bag :)
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.