Zitat:
|
schon weil Du ständig SELECT benutzt, obwohl Du wohl nur ein Feld selektieren willst.
|
Ist insofern ja auch richtig, weil das EINE Feld kummuliert werden soll. Mit JOIN kommt man da m.E. nicht unbedingt weiter...
Allerdings lässt sich dieses Subselect
Code:
(
SELECT
ROUND(SUM(Gleitzeit), 2)
FROM
tblAnwesenheit AS T1
WHERE
tblAnwesenheit.ID >= T1.ID
) AS Verlauf,
performanter gestalten:
Code:
@verlauf := ROUND(@verlauf+Gleitzeit, 2)
AS Verlauf
Warum? Zu der (Laufzeit)Variablen @verlauf wird NUR der aktuelle Feldwert (hier Gleitzeit) addiert, während bei der urspünglichen Subselect-Version jedesmal ALLE bisherigen Datensätze (intern) gesammelt werden, um daraus dann mittels SUM() den kummulierten Wert für die neue Datenzeile zu erhalten. Dürfte einleuchtend sein, dass das bei (sehr) vielen Datensätzen dann schon dauert...
Das gesammte Statement sähe dann so aus:
Code:
SELECT t.*
FROM
(
SELECT
ID,
Datum,
Gleitzeit,
@verlauf:=@verlauf+ROUND(Gleitzeit, 2) AS Verlauf,
IF(@verlauf < 25.00,
Date_ADD(Datum, INTERVAL 1 YEAR),
NULL
) AS JAZ
FROM
tblAnwesenheit, (SELECT @verlauf:=0) var
) AS t
WHERE t.JAZ IS NOT NULL
ORDER BY t.JAZ DESC Limit 0,1;
Der 'trick' ist, dass in der FROM-Klausel einmalig die Variable @verlauf auf einen definierten Anfangswert gesetzt wird und dann innerhalb des SELECT mit dem aktuellen Feldwert kummuliert wird.
Da MySql das
(SELECT @verlauf:=0) als Tabelle ansieht, muss für diesen Ausdruck in der FROM-Klausel zwingend ein Alias angegeben werden (auch wenn dieser nicht weiter verwendet wird).