2013-10-11 73 views
1

我有這個疑問:我可以在Where子句中使用「虛擬列」嗎?

set @last_uid = 0; 
set @last_tm = '00:00'; 
set @last_vid = 0; 

SELECT v.*, 
    CASE WHEN @last_uid = visitorid AND cast(@last_tm as datetime) >= subtime(timestamp, '01:00') 
    THEN 
      if((@last_tm := timestamp), @last_vid, @last_vid) 
    ELSE 
      if((@last_uid := visitorid) + (@last_vid := @last_vid+1) +(@last_tm := timestamp),@last_vid, @last_vid) 
    END AS newVisitID 

FROM visits v 
ORDER BY timestamp DESC, visitorid 

我試圖用newVisitID列在WHERE子句中是這樣的:

WHERE newVisitID <=5 

這給我的錯誤:

#1054 - Unknown column 'newVisitID' in 'where clause' 

任何人都可以幫我解決這個問題?

+0

[在WHERE MySQL查詢的子句產生錯誤使用列別名]的可能重複(http://stackoverflow.com/questions/942571/using-column-alias-in-where-clause -of-mysql-query-produce-an-error) – GSerg

回答

4

不能引用別名WHERE子句中,但你可以參考它們在HAVING

SELECT v.*, 
    CASE WHEN @last_uid = visitorid AND cast(@last_tm as datetime) >= subtime(timestamp, '01:00') 
    THEN 
      if((@last_tm := timestamp), @last_vid, @last_vid) 
    ELSE 
      if((@last_uid := visitorid) + (@last_vid := @last_vid+1) +(@last_tm := timestamp),@last_vid, @last_vid) 
    END AS newVisitID 

FROM visits v 
HAVING newVisitID <- 5 
ORDER BY timestamp DESC, visitorid 
+0

非常感謝!我會用這個答案去! – Sultanen

1

認爲你可以使用一個變量

SELECT v.*, 
    @newVisitID := CASE WHEN @last_uid = visitorid AND cast(@last_tm as datetime) >= subtime(timestamp, '01:00') 
    THEN 
      if((@last_tm := timestamp), @last_vid, @last_vid) 
    ELSE 
      if((@last_uid := visitorid) + (@last_vid := @last_vid+1) +(@last_tm := timestamp),@last_vid, @last_vid) 
    END AS newVisitID 

FROM visits v 
where @newVisitID <= 5 
ORDER BY timestamp DESC, visitorid 

或使用子查詢,如果你不想重複你的代碼。

2

您可以再次寫出來的case語句,或者更簡單的方法就是把它包起來,然後篩選子查詢:

select * from 
(
    SELECT v.*, 
     CASE WHEN @last_uid = visitorid AND cast(@last_tm as datetime) >= subtime(timestamp, '01:00') 
      THEN if((@last_tm := timestamp), @last_vid, @last_vid) 
      ELSE if((@last_uid := visitorid) + (@last_vid := @last_vid+1) +(@last_tm := timestamp),@last_vid, @last_vid) 
     END AS newVisitID 
    FROM visits v 
) x 
WHERE x.newVisitID <= 5 
ORDER BY x.timestamp DESC, x.visitorid 
相關問題