Mysql rollup und order by fehler

Liebe/-r Experte/-in,
wir haben 2 replizierte Server mit MySQL im Einsatz.
Auf dem einen (derzeitiger Produktionsserver) läuft folgende Beispielabfrage ohne Probleme:
SELECT v.name, s.stadtname, SUM(umsatz)
FROM verkauf v
INNER JOIN (SELECT stadtname FROM stadt WHERE stadtname LIKE ‚B%‘ ORDER BY stadtname) s ON v.fk_stadt = s.id
GROUP BY v.name, s.stadtname WITH ROLLUP;

Der Server hat die mySQL-Version 5.0.51b.

Auf dem anderen derzeitigen Backup-Server mit der mySQL-Version 5.1.48 läuft die Abfrage nicht, und gibt den Fehler 1221 „Incorrect Usage of Rollup with order by…“
zurück.
Das ORDER BY ist aber nur in der Subquery. Gab es in den Versionen eine Änderung was das angeht? Ich verstehe, daß ich NACH dem WITH ROLLUP kein ORDER BY verwenden darf, aber innerhalb der Subquery?
Ich muß dazu sagen, daß die oben genannte Query eventuell sogar funktioniert, ich habe eigentlich eine viel längere Abfrage, die mehr Erklärung bedürfte, daher diese als Beispielabfrage.

Vielen Dank.

Sven Schulze

Lieber Sven Schulze,

leider kann ich da wirklich nicht helfen, da ich die Versionen nicht im Einzelnen kenne und ich auch nicht so tief in mySQL stecke.
Sorry
Dennoch viel Erfolg.

Viele Grüße
Werner Esdohr

Mach nochmal die Abfrage und setze das dahinter:

OR die("

\n".$sql."

\n".mysql_error());

damit du eine vernünftige Fehlermeldung bekommst.

Ansonsten hast du wahrscheinlich eine andere mysql version laufen. Vielleicht solltest du nicht mit innerjoin arbeiten, einfach nur select.

LG Moni

Hallo Herr Schulze,

ROLLUP und ORDER gehen nicht, auch nicht, wenn ORDER BY
in der Subquery steht. In MySQL 5.0 wird das ORDER BY
in der Subquery schlicht
ignoriert, in 5.1 gibt es immer diesen Fehler.

Sie können aber mit GROUP BY sortieren, indem Sie ASC
und DESC ausdrücklich GROUP BY-Liste angeben, um die
Sortierfolge für einzelne Spalten zu bestimmen.

MfG

Thorsten

habe es gefunden. Ich habe das beide rollups rausgenommen und es hat funktioniert. Dann habe ich das erste wieder reingenommen, das hat AUCH funktioniert. Mit dem zweiten aber nicht! Nun habe ich um die zweite Abfrage noch ein SELECT gemacht, nun gehts. Vergleich alt-neu:
ALT - geht nicht
SELECT * FROM(
(SELECT … WITH ROLLUP)
UNION
(SELECT … WITH ROLLUP)
) GROUP BY …
ORDER BY …

NEU - geht
SELECT * FROM(
(SELECT … WITH ROLLUP)
UNION
(SELECT * FROM(
SELECT … WITH ROLLUP)
)
) GROUP BY …
ORDER BY …

Interessantes Verhalten!

Wieder etwas dazugelernt. Wenn etwas nicht geht, mache einfach ein SELECT drum, schon gehts :smile:

Hallo Sven,

der Rollup Modifizierer war mir bis jetzt unbekannt :smile:
Wieso die Query auf der neueren Mysql nicht läuft kann ich dir leider nicht beantworten.

Gruß
Till

Hallo Sven,

evtl. hat in der neueren Version ein verbesserter Abfrageoptimierer einen Weg gefunden, den subselect aufzulösen, und dabei ist ORDER BY quasi „übrig geblieben“ und konnte nur abschließend angefügt werden, was dann die Fehlermeldung verursacht.

Dein Beispiel selbst zeigt nicht, wieso überhaupt ein subselect, und wieso dieser sortiert werden sollte, wo doch die sortierte Spalte des subselects auch im GROUP BY steht und GROUP BY selbst eine Sortierung impliziert (auch der sekundären Spalten, und ASC|DESC ist anwendbar wie bei ORDER BY).

Das Beispiel-Statement lässt sich so vereinfachen:
SELECT v.name, s.stadtname, SUM(umsatz)
FROM verkauf v, stadt s
WHERE stadtname LIKE ‚B%‘ AND v.fk_stadt = s.id
GROUP BY v.name, s.stadtname WITH ROLLUP;
Das funktioniert, Ergebnismenge und Sortierung identisch zu deinem Bsp.
Daran dann das ORDER BY hängen, ergibt genau den Fehler 1221.
Daher meine o.g. Vermutung.

Wenn du das vereinfachte Kommando und dein Beispiel mal per EXPLAIN SELECT … prüfst (dazu muss übrigens noch id mit in den subselect), wirst du feststellen, dass sich das Kreuzprodukt der zu prüfenden Datensätze um einen Faktor im Bereich „X Millionen“ unterscheidet. Das ist zumindest ein guter Grund, diese Art von Optimierung zu versuchen.
(Das ORDER BY musst du auf der neueren Version natürlich auch bei EXPLAIN weglassen.)

Für mehr und zuverlässige Details musst du glaube ich genau den richtigen MySQL Entwickler kennenlernen und gut Freund mit ihm werden … ich kann dir nur raten, mindestens die Notwendigkeit des ORDER BY im subselect zu prüfen (im Bsp. vollkommen überflüssig) und im Idealfall den subselect aufzulösen - zugunsten einer extremen Laufzeitverbesserung.

Gruß
Thomas