2012-04-16 26 views
9

Tôi đang cố gắng để có được một số truy vấn được viết cho một số tính toàn vẹn trên hai bảng. Truy vấn là một cái gì đó như thế nàyLàm cách nào để sử dụng WHERE trên cột được tính toán?

SELECT if(o.is_discounted !=1, o.item_cost, o.discounted_item_cost) AS order_item_total, 
SUM(oi.quantity * oi.price) AS item_total 
FROM orders o 
INNER JOIN order_items oi ON oi.order_id = o.id 
WHERE order_item_total != item_total 
GROUP BY o.id 

Tôi đã chắc chắn sử dụng bí danh để cột như vậy trong quá khứ vì vậy tôi không chắc chắn lý do tại sao trong trường hợp này nó nói với tôi order_item_total không phải là một cột.

+0

bản sao của http://stackoverflow.com/questions/942571/using-column-alias-in-where-clause-of-mysql-query-produces-an-error [từ tài liệu mySQL] (http : //dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html): SQL tiêu chuẩn không cho phép tham chiếu đến các bí danh cột trong mệnh đề WHERE. Hạn chế này được áp dụng vì khi mệnh đề WHERE được đánh giá, giá trị cột có thể chưa được xác định. – xQbert

+0

Thử thay thế 'WHERE' bằng' HAVING', điều đó sẽ khắc phục được. – halfer

+0

@xQbert Bạn đúng, nhưng câu trả lời này không tốt bằng câu hỏi ở đây, theo như truy vấn cụ thể này. Thật buồn cười Tôi chưa bao giờ thử điều này trước đây - tôi nghĩ là có. Nhưng dường như nó chỉ ở trong mệnh đề ORDER BY và HAVING –

Trả lời

8

Sử dụng có trên các cột tổng hợp.

SELECT if(o.is_discounted != 1, o.item_cost, o.discounted_item_cost) order_item_total, 
    SUM(oi.quantity * oi.price) item_total 
FROM orders o 
INNER JOIN order_items oi ON oi.order_id = o.id 
GROUP BY o.id 
HAVING order_item_total != item_total 
+0

đóng và nhóm theo sau. – xQbert

+0

Yup. Đây là giải pháp tốt nhất –

4

thử đóng gói toàn bộ nội dung trong một truy vấn SELECT khác.

SELECT * 
FROM 
(
    SELECT if(o.is_discounted !=1, o.item_cost, o.discounted_item_cost) AS order_item_total, 
    SUM(oi.quantity * oi.price) AS item_total 
    FROM orders o 
    INNER JOIN order_items oi ON oi.order_id = o.id 
    GROUP BY o.id 
) x 
WHERE X.order_item_total != X.item_total 
+2

Điều này thực sự hoạt động, nhưng chờ đợi để đánh dấu câu trả lời để xem liệu có một câu hỏi con không "giả" –

+0

@DaveStein Có thể có cách tốt hơn để làm điều này. Điều này là def một cách nhanh chóng và bẩn để có được công việc làm – Taryn

4

WHERE đến trước SELECT khi thao tác dữ liệu. Vì vậy, bạn cần WHERE if(o.is_discounted !=1, o.item_cost, o.discounted_item_cost) != SUM(oi.quantity * oi.price)

Một cách khác để xử lý này là sử dụng một subquery

SELECT 
    .. 
FROM 
    (//your query here 
    ) t 
//now you can use your aliases 
WHERE t.order_item_total != t.item_total 

đây với có:

SELECT if(o.is_discounted !=1, o.item_cost, o.discounted_item_cost) AS order_item_total, 
SUM(oi.quantity * oi.price) AS item_total 
FROM orders o 
INNER JOIN order_items oi ON oi.order_id = o.id 
WHERE 1 
GROUP BY o.id 
HAVING order_item_total != item_total 
+0

Tôi đã thử rằng trước đó và sau đó nó nói với tôi "Sử dụng không hợp lệ chức năng nhóm" –

+1

@ DaveStein - Chỉ cần nhận thấy bạn đang sử dụng một mệnh đề GROUP BY, chỉ cần thay đổi WHERE một tuyên bố HAVING và nó sẽ làm việc cho bạn. – JonH

+0

'trong đó X! = Sum()'? Bạn có chắc chắn về điều đó không? –

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