2013-04-17 34 views
17

Vì bạn không thể sử dụng một cột tính toán trong một mệnh đề where trong MySQL như thế này:Tính cột trong mệnh đề where - hiệu suất

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

bạn phải sử dụng

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

Là tính toán (trong ví dụ đó "(a * b + c)" thực hiện một lần mỗi hàng hoặc hai lần? Có cách nào để làm cho nó nhanh hơn? Tôi tìm thấy nó lạ nó có thể đặt hàng trên cột nhưng không có một mệnh đề WHERE.

Trả lời

34

Bạn có thể sử dụng HAVING để lọc trên cột được tính toán:

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

Lưu ý rằng bạn cần phải bao gồm n trong mệnh đề SELECT để làm việc này.

+0

đó là lời cảm ơn tuyệt vời! Nó có hiệu suất tốt hơn/bằng/tệ hơn lặp lại công thức trong mệnh đề WHERE không? Khả năng đọc là tốt hơn tất nhiên :) –

+0

Có thể là trình tối ưu hóa mysql có thể phát hiện ra rằng các công thức WHERE và SELECT giống nhau, và không tính toán nó hai lần. Nhưng với hồ sơ theo dõi của mysql, tôi nghi ngờ nó. Điểm chuẩn nó và xem. – Barmar

+2

FYI: Dường như giải pháp này chỉ hoạt động đối với MySQL và SQL Server. –

2

Bạn có thể làm điều này:

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

Nhưng tôi không chắc chắn những gì tác động hiệu suất nó có thể có.

+1

Điều này thậm chí sẽ hoạt động? Không có cột 'n' trong truy vấn phụ. – Barmar

+1

'n' xuất phát từ truy vấn trong câu hỏi ban đầu, tôi đoán áp phích có nghĩa là' n' một số giá trị. Nếu không, truy vấn phụ sẽ được thay thế bằng '(SELECT a, b, c, (a * b + c) AS d, n) AS tmp' – Walid

Các vấn đề liên quan