2015-05-27 60 views
0

我通常知道"the order of evaluation for expressions involving user variables is undefined",所以我們不能在同一個select語句中安全地定義和使用變量。但是如果有子查詢呢?舉個例子,我有這樣的事情:定義和使用一個變量與子查詢?

select col1, 
     (select min(date_)from t where i.col1=col1) as first_date, 
     datediff(date_, (select min(date_)from t where i.col1=col1) 
       ) as days_since_first_date, 
     count(*) cnt 
from t i 
where anothercol in ('long','list','of','values') 
group by col1,days_since_first_date; 

有沒有辦法使用(select @foo:=min(date_)from t where i.col1=col1)安全,而不是重複的子查詢?如果是這樣,我可以在datediff函數中或第一次出現子查詢(或任一個)嗎?


當然,我可以做

select col1, 
     (select min(date_)from t where i.col1=col1) as first_date, 
     date_, 
     count(*) cnt 
from t i 
where anothercol in ('long','list','of','values') 
group by col1,date_; 

,然後做一些簡單的後期處理,以獲得datediff。或者我可以寫兩個單獨的查詢。但是這些不能回答我的問題,即是否可以在查詢和子查詢中安全地定義和使用相同的變量。

+1

此鏈接可能對您有所幫助。 http://stackoverflow.com/questions/16715504/mysql-define-a-variable-within-select-and-use-it-within-the-same-select –

回答

1

首先,您的查詢沒有意義,因爲date_沒有聚合函數。你會得到一個任意值。

這就是說,你可能重複子查詢,但我不明白爲什麼這將是必要的。只需使用子查詢:

select t.col1, t.first_date, 
     datediff(date_, first_date), 
     count(*) 
from (select t.*, (select min(date_) from t where i.col1 = t.col1) as first_date 
     from t 
     where anothercol in ('long','list', 'of', 'values') 
    ) t 
group by col1, days_since_first_date; 

正如我所提到的,儘管如此,第三列的值是有問題的。

注意:這對於實現子查詢會產生額外開銷。但是,無論如何,還是有一個group by,所以數據正在被多次讀取和寫入。

+0

重新分組和聚集,記我在'days_since_first_date'上進行了分組,這是每個'col1'與'date_'的一對一對應關係,也是'col1'上的。所以分組應該沒問題。 – JQKP

+0

我不明白這是如何回答這個問題的,這是在子查詢和查詢中定義和使用相同變量是否安全。 – JQKP