2017-09-05 7 views
1

に書き込み/読み出しれていないMySQLの変数は、私はテーブルを持っている:次のように各行

time datetime 

私はちょうどそのテーブルの行を選択する2つの情報を与える:その行に存在する時間と時間を前の行に表示されるので、一連の時間枠を表示できます。たとえば、このレコードを使用して:

2017-07-01 20:00:00 
2017-07-01 07:00:00 
2017-04-04 23:52:00 

すると、次の時間窓を返します:

2017-07-01 20:00:00 - null 
2017-07-01 07:00:00 - 2017-07-01 20:00:00 
2017-07-01 20:00:00 - 2017-04-04 23:52:00 

でも、私は、変数を使用して最初の変数を選択し、それぞれの行でそれを設定し、定義することができることについて次の例のように時間窓:変数が何らかの形で設定されているが、最初の実行で、それは単純に次のような結果を提供したときに、この作品

SELECT @END_DATE date_time_to, @END_DATE := date_time date_time_from FROM (
    SELECT cast('2017-07-01 20:00:00' as DATETIME) AS date_time 
    UNION 
    SELECT cast('2017-07-01 07:00:00' as DATETIME) AS date_time 
    UNION 
    SELECT cast('2017-04-04 23:52:00' as DATETIME) AS date_time 
) a ORDER BY date_time desc; 

+--------------+---------------------+ 
| date_time_to | date_time_from  | 
+--------------+---------------------+ 
| NULL   | 2017-07-01 20:00:00 | 
| NULL   | 2017-07-01 07:00:00 | 
| NULL   | 2017-04-04 23:52:00 | 
+--------------+---------------------+ 

私は単に変数にnullを設定した場合(SET @END_DATE := NULL)して、再試行してください私が取得:

+---------------------+---------------------+ 
| date_time_to  | date_time_from  | 
+---------------------+---------------------+ 
| NULL    | 2017-07-01 20:00:00 | 
| 2017-07-01 20:00:00 | 2017-07-01 07:00:00 | 
| 2017-07-01 07:00:00 | 2017-04-04 23:52:00 | 
+---------------------+---------------------+ 

私が望む結果であるが、私は自分のアプリケーションにそれを使用するたびに、私はそうでありません変数が設定されていて、最初のカラムで結果が常に得られます。ここで間違っていますか?

答えて

1

結合で変数を初期化します。

SELECT @END_DATE date_time_to, @END_DATE := date_time date_time_from FROM (
    SELECT cast('2017-07-01 20:00:00' as DATETIME) AS date_time 
    UNION 
    SELECT cast('2017-07-01 07:00:00' as DATETIME) AS date_time 
    UNION 
    SELECT cast('2017-04-04 23:52:00' as DATETIME) AS date_time 
) a 
CROSS JOIN (SELECT @END_DATE := NULL) b 
ORDER BY date_time desc; 
+0

nice!それはうまくいったが、なぜそれはそれのようなものか?私はその行動を期待していませんでした。 –

+0

ある種の最適化。ドキュメントには、同じ変数を同じ 'SELECT'リストに読み書きすることに依存できないという警告があります。これはおそらくこれを可能にします。 – Barmar

関連する問題