phpbar.de logo

Mailinglisten-Archive

[dbs] Problem mit SELECT und GROUP

[dbs] Problem mit SELECT und GROUP

Martin Ramsch m.ramsch at computer.org
Don Apr 8 04:08:30 CEST 2004


Nico Haase schrieb:

> > Wenn Du noch weißt, dass Du bei ORDER BY auch berechnete Ausdrücke
> > wie MAX(...) verwenden kannst, ist das die Lösung.
>
> Das mag ganz nett sein, aber:
>
> SELECT buchnr, vorschlag, titel, vorname, autor, LENGTH( CONCAT(
> beschreibung, fazit ) ) AS laenge FROM buecher GROUP BY vorschlag
> ORDER BY max( laenge ) DESC;
>
> MySQL meldet: #1111 - Falsche Verwendung der GROUP-Funktion.

Folglich list Du gleich im Handbuch, wie das mit GROUP BY genau
geht und findest
 13.9.3 GROUP BY with Hidden Fields
 http://www.mysql.com/doc/en/GROUP-BY-hidden-fields.html

Und dort steht eine Lösung für Dein Problem und sogar der
Verweis auf eine ausführlichere Beschreibung :-)

 3.6.4 The Rows Holding the Group-wise Maximum of a Certain Field
 http://www.mysql.com/doc/en/example-Maximum-column-group-row.html

bzw.

 4.5.4 Die Zeilen, die das gruppenweise Maximum eines bestimmten Felds enthalten
 http://www.mysql.com/doc/de/example-Maximum-column-group-row.html

Sorry, dass ich Dich nicht gleich dorthin verwiesen habe; ich hatte
die Gruppierung in Deinem Problem überlesen ...

Den Max-Concat-Trick hab' übrigens ich damals zum Handbuch bei-
gesteuert :)

Effizienter, wenn auch auf den ersten Blick nicht so schön, ist
aber die Version mit einer temporären Tabelle.

Konkret sieht das dann so aus:
 CREATE TEMPORARY TABLE tmp (
   autor    VARCHAR(255),
   laenger  INT
 );

 LOCK TABLES buecher;

 INSERT INTO tmp
   SELECT autor, MAX(LENGTH(beschreibung)+LENGTH(fazit))
   FROM buecher
   GROUP BY vorschlag;

 SELECT b.buchnr, b.vorschlag, b.titel, b.vorname, b.autor, b.laenge
 FROM buecher AS b, tmp as t
 WHERE b.autor = t.autor
   AND MAX(LENGTH(b.beschreibung)+LENGTH(b.fazit)) = t.laenge;

 UNLOCK TABLES;

 DROP TABLE tmp;

Das ist letztendlich, was ein DBMS intern bei Subqueries machen würde.

Immerhin hast Du so nur 6 Queries auszuführen, statt für jeden Autor
eine.

Ciao,
  Martin

PS: Alles trocken getippt ohnen Test, also ohne Gewähr ...
    In der tmp-Tabelle musst Du natürlich die zu Deinen Spalten
    passenden Typen verwenden!


php::bar PHP Wiki   -   Listenarchive