2009-03-10 37 views
8

Tại sao tôi không thể sử dụng cột tạm thời trong mệnh đề where?Cách sử dụng cột tạm thời trong mệnh đề where

Ví dụ, truy vấn này:

Select 
    product_brand, 
    (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count 
FROM 
    products 
WHERE 
    1 
GROUP BY 
    product_brand 

này sẽ trả về hai cột, một gọi là product_brand và một gọi là brand_count. brand_count được tạo khi đang bay và luôn luôn là 1 hoặc 0 tùy thuộc vào việc có hay không có 50 sản phẩm với thương hiệu đó.

Tất cả điều này có ý nghĩa với tôi, ngoại trừ việc tôi không thể chọn chỉ khi brand_count = 1 như trong truy vấn này dưới đây:

Select 
    product_brand, 
    (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count 
FROM 
    products 
WHERE 
    brand_count = 1 
GROUP BY 
    product_brand 

mà mang lại cho tôi lỗi này:

#1054 - Unknown column 'brand_count' in 'where clause' 

Trả lời

13

Sử dụng HAVING thay vì:

Select 
    product_brand, 
    (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count 
    FROM products 
    GROUP BY product_brand 
    HAVING brand_count = 1 

WHERE được đánh giá trước các GROUP BY. HAVING được đánh giá sau.

+0

Bạn đã sai. Nó không hoạt động trong HAVING. – thorn

+0

@thorn: nó luôn làm việc cho tôi trong MySQL. Có thể có điều gì đó sai trong truy vấn của bạn? Bạn đang chạy phiên bản MySQL nào và bạn có bật một trong các tùy chọn nghiêm ngặt không? – derobert

+0

Xin lỗi. Tôi đã nhầm lẫn MySQL với MS SQL Server. – thorn

0

Bởi vì nó có không biết cột đó là gì cho đến khi nó được xử lý xong.

Nếu bạn muốn truy cập cột theo tên đó, bạn sẽ phải sử dụng truy vấn phụ, nếu không bạn sẽ phải đủ điều kiện cột mà không có tên bạn đã cung cấp, lặp lại câu lệnh trường hợp của bạn.

2

Bởi vì trong SQL, các cột đầu tiên được "chọn" và sau đó "chiếu".

+0

Đó là ngắn gọn hơn nhiều so với nỗ lực của tôi tại giải thích :) – TheTXI

+0

Cảm ơn TheTXI: P, hurray cho các khóa học thiết kế DB họ cuối cùng đã trả hết. –

2

Bạn phải sử dụng mệnh đề đầy đủ, vì vậy bạn sẽ cần:

Select 
    product_brand, 
    (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count 
FROM products 
WHERE 
    (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) = 1 
GROUP BY product_brand 

này là như nhau cho bất kỳ lĩnh vực tính toán trong bất kỳ câu lệnh SQL.

Để đơn giản hóa:

Select Max(Points) as Highest where Highest > 10 

sẽ không làm việc, nhưng:

Select Max(Points) as Highest where Max(Points) > 10 

ý chí. Điều này cũng tương tự trong trường hợp của bạn.

0

Nếu tôi đọc ý định của bạn một cách chính xác, bạn có thể viết lại truy vấn này để đọc:

Select 
product_brand, 
COUNT(product_brand) AS brand_count 
FROM 
products 
GROUP BY 
product_brand 
HAVING 
COUNT(product_brand) > 50 

này sẽ cung cấp cho bạn tất cả product_brands rằng có một count > 50 và cũng sẽ cho bạn thấy số lượng cho mỗi loại.

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