2013-04-17 46 views
17

既然你不能在WHERE子句中使用MySQL的計算列如下:計算列 - 性能

SELECT a,b,c,(a*b+c) AS d FROM table 
WHERE d > n 
ORDER by d 

,你必須使用

SELECT a,b,c,(a*b+c) AS d FROM table 
WHERE (a*b+c) > n 
ORDER by d 

的是計算(在這個例子中「(a * b + c)」每行或兩次執行一次?有沒有辦法讓它更快?我覺得很奇怪,可以對列進行排序但不能有WHERE子句。

回答

34

您可以使用HAVING過濾在計算列:

SELECT a,b,c,(a*b+c) AS d, n FROM table 
HAVING d > n 
ORDER by d 

請注意,您需要包括n SELECT子句這個工作英寸

+0

非常感謝!它在性能方面是否比在WHERE子句中重複公式更好/相同/更差?可讀性當然更好:) –

+0

可能mysql優化器能夠檢測到WHERE和SELECT公式是相同的,並且不會計算兩次。但是,鑑於mysql的記錄,我對此表示懷疑。基準和看看。 – Barmar

+2

供參考:看來這個解決方案只適用於MySQL,也不適用於SQL Server。 –

2

你可以這樣做:

SELECT a,b,c,d FROM 
(SELECT a,b,c,(a*b+c) AS d) AS tmp 
WHERE d > n 
ORDER BY d 

但我不知道它可能有什麼影響性能。

+1

這是否會起作用?子查詢中沒有'n'列。 – Barmar

+1

'n'來自最初問題中的查詢,我想'n'表示的海報有一定的價值。如果不是,子查詢應該用'(SELECT a,b,c,(a * b + c)AS d,n)AS tmp' – Walid