2013-08-02 65 views
1

我在這裏有這樣大的查詢:如何在「having」子句中使用變量而不選擇它?

select 
user_contact_id as userContactId, 
max(attempt_number) as attemptNumber, 
max(sent_timestamp) as sentTimestamp, 
source as source, 
from 
    share_email_tracking `set` 
group by 
    user_contact_id 
having 
    (attemptNumber = 1 and date_sub(CURDATE(), interval 4 day) >= date(sentTimestamp)) 

問題是,我沒有真正感興趣attemptNumbersentTimestamp。我只需要那些來計算「有」條款。我不知道這樣做的任何語法,我認爲這是一個比「擁有」更普遍的問題,所以我一直無法在它的文檔中找到它。我相信臨時變量是可能的,但據我所知,這些是會話特定的,而不是特定於查詢的,我不希望它們污染狀態。這可能嗎?

在現實生活中,我複製了sentTimestamp幾次,所以我應該避免僅僅用它來代替它。

回答

0

你可以做他們在where子句

select 
user_contact_id as userContactId, 
max(attempt_number) as attemptNumber, 
max(sent_timestamp) as sentTimestamp, 
source as source, 
from 
    share_email_tracking `set` 

group by 
user_contact_id 
HAVING max(attempt_number) = 1 AND date(sentTimestamp) <= date_sub(CURDATE(), interval 4 day) 
+0

不,這是一個語法錯誤。這些數據在組完之後才存在,這必須在計算出哪裏之後才發生。 – djechlin

+0

@djechlin嘗試這個更新的答案 –

+0

工程,但然後我會複製'max(sent_timestamp)'幾次在我現實生活中的條款。 – djechlin

2

你可以只把它們放在你的Having。只需使用實際的表達式而不是別名。

select user_contact_id as userContactId, 
     source as source 

from share_email_tracking `set` 

group by user_contact_id 

having (max(attempt_number) = 1 and date_sub(CURDATE(), interval 4 day) >= max(sent_timestamp)) 

,如果你想表達的別名,這樣你就不必他們多次寫having子句您在你能做到這一點。創建一個子選擇,然後使用主查詢的WHERE子句中的別名。

select userContactId, source 

FROM 

(

select user_contact_id as userContactId, 
     max(attempt_number) as attemptNumber, 
     max(sent_timestamp) as sentTimestamp, 
     source as source 

from share_email_tracking `set` 

group by user_contact_id 

) as x 

WHERE (attemptNumber = 1 and date_sub(CURDATE(), interval 4 day) >= date(sentTimestamp)) 
+0

工程,但是我會在現實生活中的條款中多次複製'max(sent_timestamp)'。 – djechlin

+0

好的,呃。我更新了我的答案。 – Tom