Spalten als Variablen verwenden
Freezer
- datenbank
Hiho,
Erstmal mein Query:
SELECT
request5_2_1.id,
COUNT(task5_2_1.id) AS tasks,
SUM(task5_2_1.state='Waiting') AS waiting,
SUM(task5_2_1.state='Ready') AS ready,
SUM(task5_2_1.state='Busy') AS busy,
SUM(task5_2_1.state='Aborted') AS aborted,
SUM(task5_2_1.state='Failed') AS failed,
SUM(task5_2_1.state='Finished') AS finished,
CASE
WHEN failed>0 THEN 'Failed'
WHEN
finished>0
AND (ready=0 || ready IS NULL)
AND (busy=0 || busy IS NULL)
AND (aborted=0 || aborted IS NULL)
AND (waiting=0 || waiting IS NULL)
THEN 'Finished'
WHEN
waiting>0
OR ready>0
OR busy>0
OR aborted>0
THEN 'Busy'
ELSE 'Ready'
END AS state
FROM request5_2_1
LEFT JOIN task5_2_1 ON task5_2_1.requestId = request5_2_1.id
WHERE request5_2_1.id IN (356, 357, 358, 359, 360, 361)
GROUP BY request5_2_1.id;
Mein Problem ist, dass ich gerne die Werte aus den Spalten waiting, ready etc. als Variablen brauchen kann, wie ich das hier gemacht habe. Was muss ich ändern damit mein code funktioniert?
danke für eure Antworten
Gruss Freezer
echo $begrüßung;
Mein Problem ist, dass ich gerne die Werte aus den Spalten waiting, ready etc. als Variablen brauchen kann, wie ich das hier gemacht habe. Was muss ich ändern damit mein code funktioniert?
Verwende Variablen. Wie das in deinem DBMS geht, solltest du dessen Dokumentation entnehmen. Wie es unter MySQL geht, hatten wir grad erst gestern: https://forum.selfhtml.org/?t=133602&m=866104
echo "$verabschiedung $name";
hiho,
danke für deine Antwort. Nun hab ich das problem dass ich in den variablen den falschen wert habe und ich nicht weiss warum. ich habe das gefühl dass sich die werte in der Spalte alle um eins nach unten verschoben haben. habe ich was falsch gemacht?
SELECT
request5_2_1.id,
COUNT(task5_2_1.id) AS tasks,
@waiting:= SUM(task5_2_1.state='Waiting') AS waiting,
@ready:= SUM(task5_2_1.state='Ready') AS ready,
@busy:= SUM(task5_2_1.state='Busy') AS busy,
@aborted:= SUM(task5_2_1.state='Aborted') AS aborted,
@failed:= SUM(task5_2_1.state='Failed') AS failed,
@finished:= SUM(task5_2_1.state='Finished') AS finished,
CASE
WHEN @failed>0 THEN 'Failed'
WHEN
@finished>0
AND (@ready=0 || @ready IS NULL)
AND (@busy=0 || @busy IS NULL)
AND (@aborted=0 || @aborted IS NULL)
AND (@waiting=0 || @waiting IS NULL)
THEN 'Finished'
WHEN
@waiting>0
OR @ready>0
OR @busy>0
OR @aborted>0
THEN 'Busy'
ELSE 'Ready'
END AS state
FROM request5_2_1
LEFT JOIN task5_2_1 ON task5_2_1.requestId = request5_2_1.id
WHERE request5_2_1.id IN (356, 357, 358, 359, 360, 361)
GROUP BY request5_2_1.id;
gruss
Hi !
danke für deine Antwort. Nun hab ich das problem dass ich in den variablen den falschen wert habe und ich nicht weiss warum. ich habe das gefühl dass sich die werte in der Spalte alle um eins nach unten verschoben haben. habe ich was falsch gemacht?
Also, wenn ich so ein "Gefühl" habe, dann greife ich zu einer sehr, sehr, sehr alten Methode: Papier und Bleistift. Dann kann man sich zuerst den relevanten Abschnitt der Tabelle aufmalen und dann "händisch" die Berechnungen durchlaufen. Braucht zwar eine Zeit lang, aber danach hat man das Ergebnis.
In der heutigen Zeit, also im Zeitalter der Globalisierung und des verteilten Denkens, kann es unter Umständen auch Sinn machen, in Foren den relevanten Abschnitt der Tabelle zu posten und gemeinsam über das Problem nachzudenken.
Gruß
Hans
yo,
wir brauchen, dbms, version, bespieldaten mit den daten, die rauskommen sollen (resultset). ferner ist es besser COUNT(*) für die id zu schreiben, da wohl die id spalte niemals NULL ist.
die zuweisung innerhalb einer aggregatfunktion ist mir neu. ich habe aber meine starken zweifel daran, dass damit eine selektion der zu zählenden datensätze erfolgt. ich würde vielmehr mit dem IF operator arbeiten und im ungleichfall NULL werte einsetzen, weil diese durch aggregatfunktionen ignoriert werden.
was die variablen betrifft, kannst du sie ja erst einmal weglassen und entsprechend mit den aggregatfunktionen ausfüllen, erst recht, wenn du die ausgabe der jeweiligen aggregat-funktionen gar nicht zur ausgabe brauchst, sondern nur als zwischenergebnisse.
Ilja