Avatar billede svoeber Nybegynder
03. november 2003 - 14:55 Der er 15 kommentarer

sortering af rækker inden Group By

Jeg kan ikke umiddelbart greje, hvordan jeg får sorteret et udtræk af en database, før jeg kører en GROUP BY på rækkerne.

Jeg har to tabeller: En med firmaer og en med kategori-id'er, der kan knyttes til firmaer med en "mange-til-manger"-relation. Flere kategorier til ét firma sorteres efter en kollonne "sort".

Jeg vil lave et udtræk, der giver mig alle firmaer samt deres først-sorterede kategori (dvs sort = 1 eller bare den mindste værdi).

Laver jeg en GROUP BY på firmaer, kan jeg ikke få den først-sorterede kategori med ud.

Fx.
SELECT firma, kat_firma.kat_id, kat_firma.sort FROM firmaer
LEFT JOIN kat_firma ON kat_firma.firma_id = firmaer.id
GROUP BY firma

Dette udtræk giver mig bare tilfældige værdier for "sort" (jeg regner med, at jeg får værdien på den først indtastede kategori ud).

Udelader jeg GROUP BY og istedet indsætter "ORDER BY firma, sort" får jeg naturligvis den korrekte sortering.

Kan det lade sig gøre, at sorterere rækkerne, der bliver brugt i en GROUP BY? Jeg kan se, at det ville løse mit problem, hvis jeg kunne sortere efter "firma, sort" inden den beregner GROUP BY
Avatar billede erikjacobsen Ekspert
03. november 2003 - 15:07 #1
kan du bruge MIN(kat_firma.sort)
Avatar billede svoeber Nybegynder
03. november 2003 - 15:19 #2
Det mener jeg ikke, for så mister jeg vist tilknytningen mellem kat_firma.sort og kat_firma.kat_id
Avatar billede erikjacobsen Ekspert
03. november 2003 - 15:25 #3
Ja, hvis det er det du skal have, så mister du det. Det er faktisk non-standard
SQL overhovedet at kunne tage flere felter med end der står i din GROUP BY.
Avatar billede svoeber Nybegynder
03. november 2003 - 15:38 #4
Kan det så overhovedet lade sig gøre i ét SQL-udtræk?
Avatar billede Slettet bruger
03. november 2003 - 19:36 #5
Kan du ikke bruge

GROUP BY firma
HAVING sort = 1

eller noget tilsvarende ?
Avatar billede svoeber Nybegynder
03. november 2003 - 19:43 #6
Desværre ikke, da sort-værdien godt kan have en vilkårlig værdi, selvom den er den mindste.
Avatar billede Slettet bruger
03. november 2003 - 19:46 #7
Heller ikke

GROUP BY firma
HAVING sort = MIN(sort)
Avatar billede Slettet bruger
03. november 2003 - 19:46 #8
Glem det...det virker nok heller ikke  :-)
Avatar billede svoeber Nybegynder
03. november 2003 - 19:56 #9
Næ, men jeg kunne bruge det til at finde ud af, hvilke rækker der tilfældigvis også havde den mindste værdi for sort:

SELECT firma, kat_firma.kat_id, kat_firma.sort, MIN(kat_firma.sort) as min_sort FROM firmaer
LEFT JOIN kat_firma ON kat_firma.firma_id = firmaer.id
GROUP BY firma HAVING kat_firma.sort = MIN(kat_firma.sort)

Det hjælper dog ikke så meget :o)
Avatar billede Slettet bruger
03. november 2003 - 20:25 #10
Der burde ikke være noget i vejen for at du kombinerer
GROUP BY og ORDER BY
f.eks:

SELECT firma, kat_firma.kat_id, kat_firma.sort
FROM firmaer
LEFT JOIN kat_firma ON kat_firma.firma_id = firmaer.id
GROUP BY firma
ORDER BY kar_firma.sort
Avatar billede svoeber Nybegynder
03. november 2003 - 20:31 #11
Korrekt, men det giver blot en sortering af det forkerte udtræk - GROUP BY har stadig problemet.
Avatar billede Slettet bruger
03. november 2003 - 20:36 #12
Hvilken MySQL version bruger du ?
Avatar billede svoeber Nybegynder
03. november 2003 - 20:42 #13
3.23.53a
Avatar billede Slettet bruger
03. november 2003 - 20:49 #14
Du kan først bruge sub-SELECTs fra version 4.1.
Måske kan du oprette en TEMPORARY TABLE med data fra din første query hvor du bruger ORDER BY, og derefter udtrække fra den med en query der bruger GROUP BY.
Avatar billede svoeber Nybegynder
23. marts 2004 - 12:11 #15
Dem, der deltog kontruktivt i dette spørgsmål, må gerne lægge svar, så fordeler jeg point
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