2011-12-16 41 views
9

Tôi có một bảng mục và tôi có một bảng riêng chứa các giao dịch mua riêng lẻ của mỗi mục. Không phải mọi mặt hàng đã được mua. Tôi chọn số lượng mua và tham gia nó với bảng mục có một tuyên bố tương tự như sau:Đặt giá trị mặc định trên cột NULL từ LEFT JOIN và lọc bằng WHERE

SELECT items.name, purchases_count 
FROM `items` 
    LEFT JOIN (SELECT sales.item_name, SUM(unit_sales) AS purchases_count 
     FROM sales GROUP BY item_name) sales ON sales.item_name = items.uid 

Điều này dẫn đến dữ liệu tương tự như:

+------+-----------------+ 
| name | purchases_count | 
|------+-----------------+ 
| Shoe | 12    | 
| Belt | NULL   | 
+------+-----------------+ 

Vấn đề của tôi nảy sinh khi tôi muốn lọc kết quả này trên purchases_count. Nếu tôi sử dụng WHERE purchases_count < 10 hoặc một cái gì đó tương tự, các mặt hàng không có hồ sơ bán hàng nào cả (nghĩa là các mặt hàng có giá trị NULL) bị loại trừ khỏi tìm kiếm.

Tôi đã cố gắng sử dụng COALESCE(purchases_count,0) AS purchases_count, thiết lập chính xác NULL bản ghi thành 0, nhưng chúng vẫn không xuất hiện khi sử dụng WHERE. Tôi nghi ngờ số COALESCE đang diễn ra sau WHERE.

Tôi muốn có thể lọc số này bằng cách sử dụng WHERE và bao gồm kết quả NULL (dưới dạng số không) nếu có thể. Bất kỳ đề xuất?

+0

'bí danh' của bảng nối trái giống với tên bảng, có thực hành tốt không ?? – diEcho

+0

Truy vấn SQL đã được đơn giản hóa chỉ để tập trung vào câu hỏi, SQL thực tế khác với điều này. –

Trả lời

7

Bí danh thường không áp dụng trong mệnh đề WHERE - hãy thử COALESCE(purchases_count,0) AS purchases_count_2 với where purchases_count_2 < 10 để xem ý tôi là gì.

where COALESCE(purchases_count,0) < 10 sẽ hoạt động.

+0

Việc sử dụng purchase_count_2 sẽ không hoạt động, vấn đề tương tự khi sử dụng COALESCE trên purchase_count thông thường - nó không được công nhận trong mệnh đề WHERE. 'WHERE COALESCE (purchase_count, 0) <10' không hoạt động, nhưng tôi muốn tìm cách để không phải quấn COALESCE ở đây. Có thể là lựa chọn tốt nhất cho bây giờ mặc dù, cảm ơn. –

+0

Không chắc chắn nếu điều này hoạt động trên MySQL nhưng bạn có thể sử dụng truy vấn con: 'select * from (select ... coalesce (purchase_count, 0) as purchases_count ...) where purchases_count <10' – wrschneider

1

Làm thế nào về:

WHERE (purchases_count < 10) OR (purchases_count IS NULL) 

tất nhiên, bạn vẫn muốn được trái với các giá trị null, nhưng bạn vẫn có thể thử các tùy chọn liên hiệp để biến những null vào zero cho việc sử dụng sau này.

+0

Ý tưởng là tôi muốn trở thành có thể áp dụng các bộ lọc tùy ý cho những con số này, vì vậy tôi không muốn các NULL được trả về khi tôi đang tìm kiếm purchase_count> 6 chẳng hạn, đó là trường hợp sử dụng điều này. –

0

liên hiệp là cách chính xác, nhưng bạn không nên sử dụng WHERE, hãy thử: -

HAVING purchases_count<=10 
+0

Điều này hoàn toàn không chính xác. HAVING chỉ áp dụng khi sử dụng GROUP BY. – JamieSee

+0

người nói như vậy ????? – ajreal

+1

Chuẩn SQL yêu cầu HAVING phải chỉ tham chiếu các cột trong mệnh đề GROUP BY hoặc các cột được sử dụng trong các hàm tổng hợp. Tuy nhiên, MySQL hỗ trợ phần mở rộng cho hành vi này và cho phép HAVING tham chiếu đến các cột trong danh sách SELECT và các cột trong các truy vấn phụ bên ngoài. – ajreal

0

Vì vậy, bạn có thể thêm một mệnh đề where như thế này:

WHERE purchases_count < 10 OR purchases_count is NULL 
0

đã u thử

này
SELECT items.name, IFNULL(purchases_count,0) 
FROM `items` 
LEFT JOIN (
      SELECT item_name, SUM(unit_sales) AS purchases_count 
      FROM sales GROUP BY item_name 
      ) s ON s.item_name = items.uid 
GROUP BY items.name 
HAVING purchases_count >10 
+0

Điều này hoàn toàn không chính xác. HAVING chỉ áp dụng khi sử dụng GROUP BY. – JamieSee

+0

COALESCE sẽ không làm gì ở đây vì không có dữ liệu NULL để COALESCE bằng 0 trong truy vấn phụ để bắt đầu. –

+0

thấy có 'nhóm BY' trong' trái tham gia ' – diEcho

2

Thay vì đếm số lần mua hàng trong một truy vấn riêng biệt, chỉ cần nhóm truy vấn chính thay thế. Để lọc số đếm, hãy đặt số đó vào một số nội dung having:

select i.name, coalesce(sum(s.unit_sales), 0) as purchases_count 
from items i 
left join sales s on s.item_name = i.uid 
group by i.name 
having purchases_count < 10 
Các vấn đề liên quan