2016-07-04 4 views
1

Ich habe eine MySQL-Anweisung, die MySQL-Variablen wie "@StepWidth" und Variablen, die in IF-Anweisungen verwendet werden.MySQL Query Ergebnisfelder mit SQL @ Variable sind null

Die Abfrage funktioniert gut in MySQL Workbench, aber bei Verwendung mit PHP und mysqli_query ist das Feld mit den Variablen leer (null).

Idee ist, das Datum, das in der DB-Runde gespeichert ist, auf die nächste Minute, Stunde oder Tag abzurunden, abhängig von der durch das PHP-Skript festgelegten Schrittweite und gruppiere das Ergebnis nach dem unix_timestamp wird damit berechnet, um später in einem Diagramm ein kleines Ergebnis zur Verwendung zu erhalten.

Der Query

SELECT 
    @stepWidth:=900 as StepWidth, 
    task_template.puid, 
    task_template.ptemlate_name AS series_name, 
    round(avg(job.JOB_DURATION)) as value, 
    job.pcreation_date, 
case 
    WHEN @stepWidth < 3600 THEN @RoundedCreationDate:=from_unixtime(UNIX_TIMESTAMP(job.pcreation_date) - MOD(UNIX_TIMESTAMP(job.pcreation_date), @stepWidth), "%Y-%m-%d %H:%i:%s") 
    WHEN @stepWidth >= 3600 AND @stepWidth < 86400 THEN @RoundedCreationDate:=DATE_ADD(DATE_FORMAT(job.pcreation_date, "%Y-%m-%d %H:00:00"), INTERVAL IF(MINUTE(job.pcreation_date) < 30, 0, 1) HOUR 
) 
    WHEN @stepWidth >= 86400 then @RoundedCreationDate:=DATE_FORMAT(DATE_ADD(DATE_FORMAT(job.pcreation_date, "%Y-%m-%d %H:00:00"), INTERVAL IF(HOUR(job.pcreation_date) < 12, 0, 1) DAY),"%Y-%m-%d 00:00:00") 
END AS RoundedCreationDate, 
round(UNIX_TIMESTAMP(@RoundedCreationDate)) as start 
FROM (select @start := 0, @RoundedCreationDate := "1990-01-01") as Sqlvars, job 
    INNER JOIN task_template ON task_template.puid = job.rprocess_templateu 
WHERE job.pcreation_date BETWEEN "2013-10-02 00:00:00" AND "2013-10-02 23:59:59" 
GROUP BY task_template.puid, 
task_template.ptemlate_name,"start" 
ORDER BY task_template.ptemlate_name, "start"; 

Ich habe auch das Ergebnis in eine temporäre Tabelle zu schreiben versucht, aber das bringt das gleiche Ergebnis. Ich hoffe, dass mir jemand helfen kann. Vielen Dank.

+0

Das Verhalten von Sitzungsvariablen bei Verwendung mit Aggregatfunktionen ist nicht vorhersagbar. Alternativ können Sie zuerst die Ergebnisse mithilfe von Sitzungsvariablen vorbereiten und anschließend Aggregate auf diese Ergebnisse anwenden. Auch [*** lies eine meiner Fragen zu so ***] (http://stackoverflow.com/questions/22388419/). –

+0

Ist es möglich, dass es in Workbench funktioniert, nur weil Sie die gleiche Verbindung wiederverwenden und Ihre Variablen bereits einen Wert aus früheren Versuchen haben? –

Antwort

0

Sie scheinen ein paar Dinge zu mischen. Beispielsweise initialisieren Sie @stepWidth in der SELECT-Anweisung, während andere Variablen in einer Unterabfrage initialisiert werden.

Weiter haben Sie implizite und explizite Join-Syntax verwechselt. Dies hat zur Folge, dass implizite Joins eine niedrigere Priorität haben und dies zu Problemen führen kann.

Versuchen Sie, eine explizite CROSS Schalt JOIN und die Variablen in einem Ort initialisieren: -

SELECT 
    @stepWidth AS StepWidth, 
    task_template.puid, 
    task_template.ptemlate_name AS series_name, 
    ROUND(AVG(job.JOB_DURATION)) AS value, 
    job.pcreation_date, 
    case 
     WHEN @stepWidth < 3600 
      THEN @RoundedCreationDate:=from_unixtime(UNIX_TIMESTAMP(job.pcreation_date) - MOD(UNIX_TIMESTAMP(job.pcreation_date), @stepWidth), "%Y-%m-%d %H:%i:%s") 
     WHEN @stepWidth >= 3600 AND @stepWidth < 86400 
      THEN @RoundedCreationDate:=DATE_ADD(DATE_FORMAT(job.pcreation_date, "%Y-%m-%d %H:00:00"), INTERVAL IF(MINUTE(job.pcreation_date) < 30, 0, 1) HOUR) 
     WHEN @stepWidth >= 86400 then @RoundedCreationDate:=DATE_FORMAT(DATE_ADD(DATE_FORMAT(job.pcreation_date, "%Y-%m-%d %H:00:00"), INTERVAL IF(HOUR(job.pcreation_date) < 12, 0, 1) DAY),"%Y-%m-%d 00:00:00") 
    END AS RoundedCreationDate, 
    ROUND(UNIX_TIMESTAMP(@RoundedCreationDate)) AS start 
FROM job 
INNER JOIN task_template ON task_template.puid = job.rprocess_templateu 
CROSS JOIN 
( 
    select @start := 0, @RoundedCreationDate := "1990-01-01", @stepWidth := 900 
) AS Sqlvars 
WHERE job.pcreation_date BETWEEN "2013-10-02 00:00:00" AND "2013-10-02 23:59:59" 
GROUP BY task_template.puid, 
     task_template.ptemlate_name, 
     "start" 
ORDER BY task_template.ptemlate_name, 
      "start"; 

Beachten Sie, dass Sie tun, um weitere mögliche Probleme mit den Feldern zurück darauf zurückzuführen, wie Sie Zeilen gruppieren. Wenn zum Beispiel mehrere Werte von _job.pcreation_date_ für einen Wert von puid/ptemlate_name vorhanden sind, dann wird nicht bestimmt, welcher verwendet wird.