我有點麻煩,因爲我無法訪問Where子句中的自定義列。在許多嘗試中,只有在HAVING
條款中才有可能(速度較慢,我想避免這種情況)。是否可以在WHERE
條款上訪問?我舉一個例子:訪問WHERE子句中的自定義列(別名)
SELECT (...) IF(table1.x="bla",table1.date,table2.date) as date
FROM (...)
WHERE UNIX_TIMESTAMP(date)>1321401600
在此先感謝。
我有點麻煩,因爲我無法訪問Where子句中的自定義列。在許多嘗試中,只有在HAVING
條款中才有可能(速度較慢,我想避免這種情況)。是否可以在WHERE
條款上訪問?我舉一個例子:訪問WHERE子句中的自定義列(別名)
SELECT (...) IF(table1.x="bla",table1.date,table2.date) as date
FROM (...)
WHERE UNIX_TIMESTAMP(date)>1321401600
在此先感謝。
如果你想使用別名在WHERE
那麼您可以在一個SELECT
包裹查詢中使用別名:
SELECT *
FROM
(
SELECT (...) IF(table1.x="bla",table1.date,table2.date) as date
FROM (...)
) x
WHERE UNIX_TIMESTAMP(date)>1321401600
該代碼與Having子句不相似嗎?至少它看起來很慢:( –
如果你在沒有'WHERE'的情況下運行查詢如何執行? – Taryn
他將得到每個寄存器(大約需要20秒)。與Having條款相同的時間量(獲取每個寄存器和然後只顯示時間戳> 1321401600)。認爲它可能需要約0.5秒xD –
你需要perfom上,無論你的表的時間戳檢查案件。
E.g.
SELECT ... FROM table1
JOIN table2 ON table2.date > x
WHERE table1.date > x
不管你如何改寫它,我想你的服務器將很難優化特定的表達,所以你總能找到你的查詢速度很慢,但我想做到的最好的事情是測試每個人的答案,看看哪一個是最快的。所以考慮到這一點,這裏是我的建議:
WHERE (table1.x = "bla" AND UNIX_TIMESTAMP(table1.date) > 1321401600)
OR (table1.x != "bla" AND UNIX_TIMESTAMP(table2.date) > 1321401600)
如果我做2個查詢?一個使用table1.date和table2.date,然後在我的PHP嘗試做剩下的事情...你認爲它更快? –
我不知道有什麼方法可以告訴我們,但實際上並沒有對它進行測試,這是您的工作。 – Neil
在這種情況下,您需要對兩個表執行時間戳檢查。 '(where table1.date> x)'還有你的連接'(在table2.date> x上連接table2)' – Daniel
丹尼爾,其中的IF子句在WHERE中? –