Rolf B: SQL, verschachtelte Unterabfragen funktionieren nicht

Beitrag lesen

Hallo MartinL,

ich habe deinen Code formatiert. Dazu schreibt man eine Zeile ~~~sql vor die Abfrage und dahinter eine Zeile mit ~~~

Wenn ich das mal versuche, passend einzurücken:

SELECT `zaehler` + 27 AS `Ergebnis`
FROM `test`,
     (SELECT `zahl1`, (`zahl1` - `mw`) AS `zaehler`
      FROM `test` AS `t1`,
           (SELECT AVG(`zahl1`) AS `mw` FROM `test`) AS `t2`
     );

dann hätte ich drei Hinweise:

(1) Table-Ausdrücke in der FROM-Klausel brauchen immer einen Aliasnamen. D.h. direkt vor dem Semikolon muss noch ein AS t3 oder so stehen. Der fehlt ihm, und deswegen meckert er, dass vor dem LIMIT 0,25 was faul sei.

(2) LIMIT 0,25 fügt PHPmyadmin ein, richtig. Wenn Du mal schaust, siehst Du ein Auswahlfeld, wieviele Zeilen vom Ergebnis er anzeigen soll. Das steht per Default auf 25. Und da es beim ersten Ausführen die ersten 25 Zeilen sein sollen, muss er 0 Zeilen überspringen. Auf Mysqlesisch: LIMIT 0,25.

(3) Was zum grundgütigen Geier tust Du da? Das ist ein bedingungsloser Join der TEST Tabelle mit der Ergebnistabelle, die ich t3 genannt habe. Und t3 besteht wiederum aus einem bedingungslosen Join von test mit t2. t2 hat immerhin nur eine Row, d.h. t2 ist genauso groß wie test, aber dann entsteht ein kartesisches Produkt test × t3. Falls test 1000 Zeilen hat, besteht t3 aus 1000 Rows und das Gesamtergebnis aus einer Million Rows, von denen jeweils 1000 identisch sind, weil Du die zahl1 Spalte aus t3 nicht verwendest.

Willst Du für alle Rows in Test die Differenz von zahl1 zum Mittelwert aller zahl1 wissen, erhöht um 27? Also $$x - \overline x + 27$$?

SELECT (27 + zahl1 - (SELECT AVG(zahl1) FROM test)) AS Ergebnis
FROM test

Backticks sind ein Sicherheitsnetz gegen irrtümlich verwendete Schlüsselwörter in SQL Queries und werden auch gebraucht, wenn eine Spalte kleinster Wert heißen soll. phpMyAdmin generiert sie stumpf um jeden SQL Namen herum. Aber nötig sind sie deswegen nicht; ich lasse sie weg, wann immer es geht.

Wenn Du noch andere Dinge in der Query hast, die die Komplexität nötig machen und die Du zum Nachstellen des Fehlers weggelassen hast, ist das natürlich was anderes. Aber vielleicht solltest Du uns dann deine reale Query präsentieren, ggf. gibt's da auch Optimierungspotenzial.

Rolf

--
sumpsi - posui - obstruxi