2013-04-17 11 views
17

あなたは、このようなMySQLでのWHERE句で計算された列に使用することはできませんので:計算列 - パフォーマンス

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"は1行または2回実行されます)?高速化の方法はありますか?列のORDERは可能ですがWHERE句は使用できません。

答えて

34

HAVINGあなたが仕事に、このためのSELECT句でnを含める必要が

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

注:計算列でフィルタリングします。

+0

大変ありがとうございます。それはWHERE句で数式を繰り返すよりもパフォーマンスが良い/等しい/悪いですか?可読性はもちろん良いです:) –

+0

mysqlオプティマイザは、WHEREとSELECTの式が同じであることを検出し、2回計算しない可能性があります。しかし、mysqlの実績を考えると、私はそれを疑う。ベンチマークして見てください。 – Barmar

+2

FYI:このソリューションは、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'は最初の質問のクエリから来ています。そうでなければ、サブクエリは '(SELECT a、b、c、(a * b + c)AS d、n)AS tmp' – Walid