Mailinglisten-Archive |
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