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, ... )
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 ?
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:
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 :)
"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.
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 !
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.