Freezer: Spalten als Variablen verwenden

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

  1. 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";

    1. 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

      1. 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

      2. 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