MySQL: Alias in SELECT weiterverwenden
Erk
- php
Hallo!
ich bin etwas verwundert darüber, dass folgende Zeile in MySQL einen Fehler erzeugt, in Access aber nicht:
SELECT SMS * 3 AS dreifach, Faktor1 - Faktor2 AS faktor, dreifach * faktor AS megafaktor FROM tarife_neu;
Fehler: unknown column 'dreifach'
Hintergrund ist, dass in meiner Abfrage die Berechnung von dreifach und von faktor jeweils sehr viele Rechenoperationen benötigt und ich die Werte in derselben Abfrage an späterer Stelle noch häufiger wiederverwenden will. Natürlich könnte ich einfach SMS * 3 * (Faktor1 - Faktor2) AS megafaktor schreiben, aber dann würden die gleichen Operationen mehrmals durchgeführt werden. In Access kann man einen Alias in derselben Abfrage für weitere Berechnungen verwenden, in MySQL nicht.
Wie kann ich das lösen?
Vielen Dank im Voraus!
Erk
echo $begrüßung;
In Access kann man einen Alias in derselben Abfrage für weitere Berechnungen verwenden, in MySQL nicht.
Wie kann ich das lösen?
Wenn es nicht geht, mit einem Alias weiterzurechnen, was erwartest du dann für eine Lösung?
Hintergrund ist, dass in meiner Abfrage die Berechnung von dreifach und von faktor jeweils sehr viele Rechenoperationen benötigt und ich die Werte in derselben Abfrage an späterer Stelle noch häufiger wiederverwenden will.
Wenn die Berechnung so oft stattfindet, dann erzeuge doch dafür eine Spalte, in der die vorberechneten Werte drinstehen. Wenn du was optimieren willst, analysiere zuerst das Problem und erzeuge Messwerte. Dann kannst du versuchen, Optimierungen einzubauen, deren Erfolg du wieder messen solltest.
echo "$verabschiedung $name";
moin,
Wenn die Berechnung so oft stattfindet, dann erzeuge doch dafür eine Spalte, in der die vorberechneten Werte drinstehen.
damit wäre ich vorsichtig, wenn du damit eine spalte in der tabelle und nicht in einer view/abfrage meinst. prozessdaten zu persistieren ist kein teufelswerk, aber wenn es geht, würde ich es immer in einer OLTP datenbank vermeiden, weil somit immer die latente gefahr von inkonsistenzen bestehen.
Ilja
Wie kann ich das lösen?
Mit einem Subselect, welches die Berechnung enthält sollte dir eigentlich geholfen sein.
Ist aber so viel ich weiss erst ab MySQL 4.irgendwas möglich.
echo $begrüßung;
Mit einem Subselect, welches die Berechnung enthält sollte dir eigentlich geholfen sein.
Du meinst ein Subselect in der FROM-Klausel? Denn in der SELECT-Klausel hat es ja das gleiche Problem wie die direkte Notation. Wenn du es in der FROM-Klausel geplant hast, kann sich das unter Umständen negativ auswirken, muss doch dieses Subselect nun für jeden Datensatz berechnet werden, der die JOIN-Bedingung erfüllt, nicht nur für den "Rest", der sonst nach dem WHERE übrig bleibt.
echo "$verabschiedung $name";
Du meinst ein Subselect in der FROM-Klausel? Denn in der SELECT-Klausel hat es ja das gleiche Problem wie die direkte Notation. Wenn du es in der FROM-Klausel geplant hast, kann sich das unter Umständen negativ auswirken, muss doch dieses Subselect nun für jeden Datensatz berechnet werden, der die JOIN-Bedingung erfüllt, nicht nur für den "Rest", der sonst nach dem WHERE übrig bleibt.
Ja, ich meinte Subselect in der FROM Klausel. Mir war gar nicht bewusst, das das auch in der SELECT Klausel möglich ist.
Kommt jetzt natürlich ganz drauf an wie die Abfrage aussieht. Aber man kann ja im Subselect auch schon die Daten mit Where einschränken.
Hi,
Hintergrund ist, dass in meiner Abfrage die Berechnung von dreifach und von faktor jeweils sehr viele Rechenoperationen benötigt und ich die Werte in derselben Abfrage an späterer Stelle noch häufiger wiederverwenden will. Natürlich könnte ich einfach SMS * 3 * (Faktor1 - Faktor2) AS megafaktor schreiben, aber dann würden die gleichen Operationen mehrmals durchgeführt werden.
Theoretisch - aber auch praktisch?
Ich denke mal, dass die DB da auch in der Lage ist, sowas zu "erkennen" (beim Parsen der Query) und entsprechend zu optimieren. (Ergab sich die Frage daraus, dass du in der Praxis schlechte Performance festgestellt hast - oder nur aus theoretischer Ueberlegung?)
In der MySQL-Doku gab's IIRC auch mal eine Seite darueber, was der Query-Parser wie optimiert - aber die kann ich grade nicht mehr finden ...
MfG ChrisB