2016-07-04 10 views
1

IFステートメントで使用される "@StepWidth"や変数などのMySQL変数を使用するMySQL Statementがあります。MySQLを使用したクエリ結果フィールド@variableはNULLです

クエリはMySQL Workbenchで問題なく動作しますが、PHPとmysqli_queryを併用すると、変数のフィールドが空(null)に戻ります。

PHPスクリプトによって設定されたステップ幅の値に応じて、DBに格納された日付を次の分、時、または日に丸めて、その結果をunix_timestampでグループ化する後でチャートで使用するためにこれを使って小さな結果を得るために計算されます。

クエリ

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

私も一時テーブルに結果を書き込むしようとしているが、これは同じ結果をもたらします。 誰かが私を助けてくれることを願っています。 ありがとうございます。

+0

集約関数でセッション変数を使用した場合の動作は予測できません。または、セッション変数を使用して結果を準備し、その結果に集約を適用します。また、[***私の質問の1つを読む***](http://stackoverflow.com/questions/22388419/)。 –

+0

同じ接続を再利用し、変数にすでに以前の試行の値があるため、Workbenchで動作する可能性はありますか? –

答えて

0

あなたはいくつかを混在させているようです。たとえば、SELECT文で@stepWidthを初期化し、他の変数はサブクエリで初期化します。

また、暗黙の結合構文と明示的な結合構文が混在しています。この結果、暗黙的な結合の優先順位が低くなり、問題が発生する可能性があります。

JOINと一つの場所に変数を初期化する明示的なCROSSに切り替えてみてください - あなたはフィールドでの更なる潜在的な問題を持っている

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

注意返されたため、あなたが行をグループ化する方法に。たとえば、puid/ptemlate_nameの値に_job.pcreation_date_の値が複数ある場合、どの値が使用されているかは決まっていません。

関連する問題