Avatar billede hwlarsen Nybegynder
17. september 2002 - 20:01 Der er 15 kommentarer og
1 løsning

group by og order by

Hej

Jeg har et problem med at få den rigtige sortering af et sql udtræk.

Min sql:

select * from galleri where galleri.visible=1 and galleri.FromDate>'xxxx-xx-xx' group by galleri.FromDate order by galleri.FromDate desc


Dette virker også fint men jeg vil gerne opnå en anden sortering af de data der groperes. Jeg vil have den record vist med det største nummer i feltet"view" viest.

Kan dette lade sig gøre??
Avatar billede disky Nybegynder
17. september 2002 - 20:17 #1
select * from galleri where galleri.visible=1 and galleri.FromDate>'xxxx-xx-xx' group by galleri.FromDate order by view, galleri.FromDate desc

Hvor view er tabel og kolonne navn du vil sortere på.
Avatar billede hwlarsen Nybegynder
17. september 2002 - 20:25 #2
Detter giver bare en anden sortering af det færdige resultat, det der skal være en anden sortering af det er af de felter der grouperes sammen til en. Det er den ene der skal være den med den største view, af alle dem der bliver fjernet ved group by.
Avatar billede disky Nybegynder
17. september 2002 - 20:29 #3
så må jeg melde pas, jeg er slet ikke med hvad du mener :(
Avatar billede hwlarsen Nybegynder
17. september 2002 - 20:40 #4
Prøver lige igen!! med et eksempel, tabelle har følgende data:

Visible - Nummer - View - Navn
1      - 1      - 2    - a
1      - 3      - 76  - b
1      - 2      - 3    - c
1      - 1      - 5    - d
1      - 4      - 3    - e
1      - 1      - 4    - f
1      - 2      - 9    - g
1      - 3      - 4    - h

sql: select * from XXXX where Visible=1 group by Nummer order by Navn

Dette giver:

Visible - Nummer - View - Navn
1      - 1      - 2    - a
1      - 3      - 76  - b
1      - 2      - 3    - c
1      - 4      - 3    - e


Det jeg vil opnå er:

Visible - Nummer - View - Navn
1      - 3      - 76  - b
1      - 1      - 5    - d
1      - 4      - 3    - e
1      - 2      - 9    - g



Håber det hjalp på formuleringen.....
Avatar billede disky Nybegynder
17. september 2002 - 20:52 #5
virker:
sql: select * from XXXX where Visible=1 group by Nummer order by View

ikke ?
Avatar billede lasse_buck Nybegynder
17. september 2002 - 21:33 #6
Jeg har desværre ikke tid til at test syntaksen før senere, men måske illustrerer dette, hvad du mener:
SELECT XXXX.* FROM XXXX, (SELECT nummer, MAX(view) AS max FROM XXXX WHERE XXXX.Visible=1) as maxviews WHERE XXXX.Nummer = maxviews.Nummer AND XXXX.View = maxviews.max AND XXXX.Visible=1 ORDER BY Navn DESC;

Gruppenringen finder max(view) for hver værdi (gruppe) af nummer.
Du vil nu udvælge (og sortere) de rækker, hvor nummer har view=max(view).
Avatar billede hwlarsen Nybegynder
17. september 2002 - 23:32 #7
Okay nu fatter jeg intet!! Hvis du gider prøve at lave det på mit rigtige sql udtryk ville det være kanon det er:

select * from galleri,places where galleri.visible>=1 and galleri.PlaceNo=places.ItemNo and galleri.FromDate>'2002-09-01' group by galleri.FromDate, galleri.PlaceNo, galleri.Serie order by galleri.fromdate desc

Det ser ellers meget spændende ud!!
Avatar billede lasse_buck Nybegynder
18. september 2002 - 00:05 #8
hwlarsen >> Jeg ved ikke, om du stadig er oppe. Jeg skulle lige have overstået min aftenløbetur :o)
Du skriver: "Det er den ene der skal være den med den største view". I dit rigtige sql-udtryk, for hvilket felt vil du kun have de rækker med den højeste værdi?
Avatar billede lasse_buck Nybegynder
18. september 2002 - 00:50 #9
Når man anvender GROUP BY, deles tabellens rækker op i grupper. I en SELECT med GROUP BY, skal alle værdierne i select-listen være:
1. med i GROUP BY delen ELLER
2. udtryk med aggregat funktioner ELLER
3. konstanter
Databasen udfører aggregat funktionen på hvert udtryk i select-listen for hver gruppe af rækker og returnerer en enkelt resultatrække for hver gruppe.

Tag f.eks. tabellen xyz (x number, y number, z number).
x  y    z
1  1    1
1  2    2
1  11  11
2  2    1
2  2    2
2  3    3
3  3    3

Når man skriver GROUP BY x,y - så vil det sige, at rækker med samme x-værdi og samme y-værdi tilhører samme gruppe.

SELECT x FROM xyz GROUP BY x;
er det samme som SELECT DISTINCT x FROM xyz;

SELECT x,y FROM xyz GROUP BY x;
FEJL! Vi opdeler i grupper, hvor x er ens. Der kan være flere forskellige y-værdier i hver gruppe.

SELECT x, MAX(y) AS max FROM xyz GROUP BY x;
Helt OK! Selvom der er flere y-værdier for hver gruppe, så er der kun een maxværdi.

ORDER BY er først aktuel efter GROUP BY:
SELECT x, MAX(y) AS max FROM xyz GROUP BY x ORDER by max DESC;
Avatar billede lasse_buck Nybegynder
18. september 2002 - 01:11 #10
hwlarsen >> Humlen er, at når du bruger GROUP BY, så får du KUN aggregerede (dvs beregnede) værdier for hver gruppe af rækker samt de værdier, som identificerer selve gruppen. Det er IKKE det samme som at udvælge HELE enkelt-rækker.
ORDER BY gør slet ingen forskel. Den sorterer kun, hvad der kommer ud af GROUP BY.

Prøv at se på mit 'kryptiske' SQL-udtryk længere oppe igen.
Første trin står inde i parantesen. Ved hjælp af GROUP BY bestemmes max-værdien for hver gruppe. Output af denne parantes navngives maxviews.
Andet trin er en join imellem maxviews og XXXX, som anvendes til at udvælge rækkerne, som indeholder max-værdierne.
Avatar billede hwlarsen Nybegynder
18. september 2002 - 01:17 #11
Det er feltet galleri.bigview der er det felt som skal være det største!

Har lige kikket lidt på din beksrivelse og det er nok rigtigt men jeg er ikke så stiv i det her!!
Avatar billede lasse_buck Nybegynder
18. september 2002 - 01:44 #12
Jeg prøver nu samme øvelse på dit SQL-udtryk. Der er nu to tabeller, og det fremgår ikke helt, hvad du gerne vil.

Kriterie:
galleri.visible>=1 AND galleri.PlaceNo=places.ItemNo AND galleri.FromDate>'2002-09-01'

Gruppering:
Vi ønsker grupperer efter galleri.PlaceNo, galleri.Serie og vi ønsker kun de rækker med højeste galleri.fromdate.

Dette select identificerer hvilke rækker vi er interesserede i:
SELECT galleri.PlaceNo, galleri.Serie, MAX(galleri.bigview) AS maxview
FROM galleri,places where galleri.visible>=1 AND galleri.PlaceNo=places.ItemNo AND galleri.FromDate>'2002-09-01'
GROUP BY galleri.PlaceNo, galleri.Serie;

Nu pakker vi så den SELECT udenom, som udvælger rækkerne:
SELECT * FROM galleri,places,(
SELECT galleri.PlaceNo, galleri.Serie, MAX(galleri.bigview) AS maxview
FROM galleri,places where galleri.visible>=1 AND galleri.PlaceNo=places.ItemNo AND galleri.FromDate>'2002-09-01'
GROUP BY galleri.PlaceNo, galleri.Serie
) maxrows
WHERE galleri.visible>=1 AND galleri.PlaceNo=places.ItemNo AND galleri.FromDate>'2002-09-01'
AND galleri.bigview=maxrows.maxview AND galleri.PlaceNo=maxrows.PlaceNo AND galleri.Serie=maxrows.Serie;

Sortering:
Hvis det er de korrekte data, kan du altid tilføje sortering til sidst:
... ORDER BY galleri.fromdate DESC;

Lidt supplerende kommentarer:
"SELECT *" bør nok erstattes af navnene på de ønskede felter.

Den innerste select med GROUP BY kan evt. oprettes som et view. Så bliver det endelige SQL-udtryk meget mere overskueligt.

I mit oprindelige svar skrev jeg: "...) as maxview...".  I Oracle (og sikkert også MySQL) skal "as" fjernes, ellers får man syntaksfejl.
Avatar billede lasse_buck Nybegynder
18. september 2002 - 01:47 #13
Det burde nok have været et svar...

Da jeg ikke har dine tabeldefinitioner, er chancen for, at jeg har lavet en forståelses- eller syntaksfejl overhængende.

Prøv at få den fulde forståelse af GROUP BY ud fra mine kommentarer og prøv af med nogle simple eksempler først.
Avatar billede hwlarsen Nybegynder
19. september 2002 - 18:48 #14
Det kan jeg altså ikke få til at virke, jeg kan godt se ideen med det. Jeg har ladet mig fortælle at MySQL kun kan klare sql med et niveau, altså ikke med select i parantes.
Avatar billede lasse_buck Nybegynder
19. september 2002 - 18:57 #15
Jeg vidste ikke, at MySQL havde begrænsninger i den retning. (Jeg bruger Oracle), men det problem tror jeg kan løses med mit tidligere forslag:
"Den innerste select med GROUP BY kan evt. oprettes som et view. Så bliver det endelige SQL-udtryk meget mere overskueligt."

CREATE VIEW maxrows AS SELECT ...;  (hele smøren i parantesen).
Avatar billede hwlarsen Nybegynder
16. januar 2003 - 20:33 #16
Lukker
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