2012-01-24 14 views
0

「duration_in_queue」にNULL以外の値が設定されるためには、次のSQLを2回実行する必要があります。MySQLの変数はすぐに利用できません

SQL変数が設定または保存されていないと仮定しますか?私は時間の無駄に解決策を見つけようと、ここで誰かが:)

SELECT 
    DATE(pm.rstdtime) AS cntldate, 
    sh.sd_no, 
    sh.work_group, 
    ROUND(
     IF (
      @sd_id = sh.sd_no, 
      (
       TIMESTAMPDIFF(
        SECOND, 
        @dt, 
        sh.data_entry_dtime 
       )/86400 
      ) * 86400 + LEAST(0, @dt := sh.data_entry_dtime), 
      NULL + LEAST(0, @sd_id := sh.sd_no) + (@dt := sh.data_entry_dtime) 
     ) 
    ) AS duration_in_queue 
FROM 
    p_master pm 
LEFT JOIN s_history sh ON pm.sd_no = sh.sd_no, 
(SELECT(@sd_id := 0)) AS a 
WHERE 
    sh.log_text IN (
     'Created', 
     'Dispatched', 
     'Restored' 
    ) 
AND CONVERT_TZ(
    sh.data_entry_dtime, 
    'GMT', 
    'Australia/NSW' 
) <= pm.rstdtime 
ORDER BY 
    sh.sd_no, 
    sh.data_entry_dtime, 
    sh.log_text 
LIMIT 10 

任意の助けを助けることができることを期待してのためにそれにされている

をいただければ幸いです。

ありがとうございました。

答えて

1

私はSQL変数が設定されていないと仮定しますか?

これは正しい可能性があります。 the documentationによると

:一般的なルールとして

は、ユーザー変数に値を割り当てないと、同じ文の中に値を読んでください。期待した結果が得られるかもしれませんが、これは保証されていません。ユーザー変数を含む式の評価順序は未定義であり、指定されたステートメントに含まれる要素に基づいて変更される可能性があります。さらに、この順序は、MySQL Serverのリリース間で同じであることが保証されていません。

+0

こんにちはruakh、私はそれを読んだが、 "(SELECT(@ sd_id:= 0))as" @変数を設定していません。私はまた、SELECT * FROM(上記のクエリ)を入れようとしましたが、それは事を変更しませんでした:( – mybigman

+0

@mybigman: '@sd_id:= 0'の唯一の保証については、' '0''と' ' )は、同じデータベース接続を使用して実行する次のSQLクエリの前に '@ sd_id'を' 0'に設定することになります。特に、 '@ sd_id'を' 0'に設定する保証はありませんこのクエリの実行中に予測可能なポイント。 – ruakh

関連する問題