Avatar billede muffet Nybegynder
20. januar 2004 - 08:04 Der er 8 kommentarer

group by

Jeg blev fældet til eksamen igår fordi en i min gruppe havde lavet et kald, hvor han brugte en group by statement. Vores sensor mente at det var en stor fejl...

kaldet så ud som nedenfor:

SELECT a.Titel, a.Dato, COUNT(eid), a.id, a.teaser FROM emne AS a LEFT JOIN Overskrift AS b ON a.id = b.eid GROUP BY a.Titel;

Problemet var den group by - han mente ikke at man måtte "selecte" andet end a.Titel, dvs. det der blev grupperet efter... kan det virkelig passe?

Det blev lavet på en MySQL database, men jeg vil egentlig gerne høre, hvordan det hænger sammen i andre database. Kan kaldet udføres der? (MSSQL, Oracle, ... )
Avatar billede limemedia Nybegynder
20. januar 2004 - 08:14 #1
Man kan da sagtens selecte flere variabler end den man grupperer efter... specielt hvis man sammentæller poster i samme kategori, fx vil
  SELECT COUNT(id), titel
  FROM table
  GROUP BY title
give dig en liste over unikke titler i tabellen, samt vil COUNT(id) fortælle dig hvor mange linier der var ens - hvis to rækker indeholder fx "muffet" vil COUNT(id) være 2

Hele idéen med "group by" går jo til grunde, hvis man ikke kunne vælge flere felter end den man grupperede efter

Sikker på det ikke var en fælde ad censor, for at se hvor meget du/i vidste om "group by", og dermed forklare at hans påstand måtte være forkert ?
Avatar billede erikjacobsen Ekspert
20. januar 2004 - 08:16 #2
Det er lidt underligt at det er tilladt i MySql - det er ikke i fx MsSql.

Du kan formelt kun angive attributter du rent faktisk laver group by over,
og beregninger på dem du ikke laver group by over.

At MySql tillader at angive attributter, uden beregninger, som ikke er med
i group by, betyder også at den må vælge en "tilfældig" værdi blandt de
forskellige der er for dem pågældende attribut, og at resultatet af samme
forespørgsel kan give forskellige resultater ppå een og samme tabel.

Derfor er det generelt et problem.

Mysql skriver selv:

MySQL has extended the use of GROUP BY. You can use columns or calculations in the SELECT expressions that don't appear in the GROUP BY part. This stands for any possible value for this group. You can use this to get better performance by avoiding sorting and grouping on unnecessary items. For example, you don't need to group on customer.name in the following query:

mysql> SELECT order.custid,customer.name,MAX(payments)
    ->        FROM order,customer
    ->        WHERE order.custid = customer.custid
    ->        GROUP BY order.custid;

In ANSI SQL, you would have to add customer.name to the GROUP BY clause. In MySQL, the name is redundant if you don't run in ANSI mode.

Don't use this feature if the columns you omit from the GROUP BY part aren't unique in the group! You will get unpredictable results.

In some cases, you can use MIN() and MAX() to obtain a specific column value even if it isn't unique. The following gives the value of column from the row containing the smallest value in the sort column:
Avatar billede erikjacobsen Ekspert
20. januar 2004 - 08:17 #3
Dit eksempel, Lars, er lige efter bogen, mens det er problemet er dette:'

  SELECT COUNT(id), titel,  forfatter
  FROM table
  GROUP BY title
Avatar billede arne_v Ekspert
20. januar 2004 - 08:25 #4
Umiddelbart vil jeg sige at det er hårdt at "fælde" en til eksamen for at ikke
at være klar over at den feature ikke virker i standard SQL.

Men Erik har helt ret i forklaringen. Den er ikke standard SQL.
Avatar billede muffet Nybegynder
20. januar 2004 - 08:35 #5
Fældet er også så meget sagt, jeg fik et 9-tal, men jeg blev godt nok gal over at censor nærmest kaldte os dumme.

Hvis alle der deltager i debatten lægger et svar, så deler jeg point ud på et tidspunkt...
Avatar billede muffet Nybegynder
20. januar 2004 - 08:37 #6
Det sjove var at ham der havde lavet kaldet havde skrevet GROUP BY, fordi han ikke kunne få ORDER BY til at virke... Jeg kunne ha' slået ham ;) men jeg valgte at gå hjem i stedet :)
Avatar billede trer Nybegynder
20. januar 2004 - 08:55 #7
"Don't use this feature if the columns you omit from the GROUP BY part aren't unique in the group! You will get unpredictable results. "

Umiddelbart ville jeg mene, at benytte sådan en feature i MySQL er en "fed" måde at lægge en landmine til en senere udvidelse...  Jeg er DBA og må nok sige, at hvis jeg fandt den slags brugt i noget SQL fra en udvikler, så røg det tilbage i hovedet på ham igen.
Avatar billede arne_v Ekspert
20. januar 2004 - 10:05 #8
Han kom vel ikke til at nævne det med ORDER BY versus GROUP BY til censor ?

For i så fald kan jeg nemlig godt forstå at censor blev lidt betænkelig !
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