2012-09-10 43 views
0

我有點麻煩,因爲我無法訪問Where子句中的自定義列。在許多嘗試中,只有在HAVING條款中才有可能(速度較慢,我想避免這種情況)。是否可以在WHERE條款上訪問?我舉一個例子:訪問WHERE子句中的自定義列(別名)

SELECT (...) IF(table1.x="bla",table1.date,table2.date) as date 
FROM (...) 
WHERE UNIX_TIMESTAMP(date)>1321401600 

在此先感謝。

+0

在這種情況下,您需要對兩個表執行時間戳檢查。 '(where table1.date> x)'還有你的連接'(在table2.date> x上連接table2)' – Daniel

+0

丹尼爾,其中的IF子句在WHERE中? –

回答

0

如果你想使用別名在WHERE那麼您可以在一個SELECT包裹查詢中使用別名:

SELECT * 
FROM 
(
    SELECT (...) IF(table1.x="bla",table1.date,table2.date) as date 
    FROM (...) 
) x 
WHERE UNIX_TIMESTAMP(date)>1321401600 
+0

該代碼與Having子句不相似嗎?至少它看起來很慢:( –

+0

如果你在沒有'WHERE'的情況下運行查詢如何執行? – Taryn

+0

他將得到每個寄存器(大約需要20秒)。與Having條款相同的時間量(獲取每個寄存器和然後只顯示時間戳> 1321401600)。認爲它可能需要約0.5秒xD –

0

你需要perfom上,無論你的表的時間戳檢查案件。

E.g.

SELECT ... FROM table1 
    JOIN table2 ON table2.date > x 
WHERE table1.date > x 
0

不管你如何改寫它,我想你的服務器將很難優化特定的表達,所以你總能找到你的查詢速度很慢,但我想做到的最好的事情是測試每個人的答案,看看哪一個是最快的。所以考慮到這一點,這裏是我的建議:

WHERE (table1.x = "bla" AND UNIX_TIMESTAMP(table1.date) > 1321401600) 
    OR (table1.x != "bla" AND UNIX_TIMESTAMP(table2.date) > 1321401600) 
+0

如果我做2個查詢?一個使用table1.date和table2.date,然後在我的PHP嘗試做剩下的事情...你認爲它更快? –

+1

我不知道有什麼方法可以告訴我們,但實際上並沒有對它進行測試,這是您的工作。 – Neil