2011-12-29 30 views
5

Tôi có hai bảng với dữ liệu mẫu sau:Làm thế nào để bao gồm các giá trị NULL trong một truy vấn với Outer Join Tập đoàn By

Table 1: `item_name` 
| item_id | item_desc | 
| 1  | apple  | 
| 2  | orange | 
| 3  | banana | 
| 4  | grape  | 
| 5  | mango  | 

Table 2: `user_items` 
| user_id | item_id | 
| 127  | 1  | 
| 127  | 2  | 
| 127  | 4  | 
| 128  | 1  | 
| 128  | 5  | 

Tôi đang cố gắng để lựa chọn một tổng số của mỗi item_id cả user_id 127 và 128 có, cùng với tương ứng ITEM_DESC bằng cách sử dụng truy vấn sau đây:

SELECT IFNULL(COUNT(ui.user_id), 0) AS total, in.item_desc 
FROM user_items AS ui 
RIGHT OUTER JOIN item_name AS in 
    ON ui.item_id = in.item_id 
WHERE ui.user_id IN (127, 128) 
GROUP BY ui.item_id 
ORDER BY total DESC 

kết quả của các truy vấn trên là:

| total | item_desc | 
| 2  | apple  | 
| 1  | orange | 
| 1  | grape  | 
| 1  | mango  | 

nhưng nó không bao gồm item_id 3, chuối, mà tôi muốn lấy với RIGHT OUTER JOIN. Tôi đã hy vọng nhận được kết quả như sau:

| total | item_desc | 
| 2  | apple  | 
| 1  | orange | 
| 1  | grape  | 
| 1  | mango  | 
| 0  | banana | 

Có cách nào để sửa đổi truy vấn để kết thúc với kết quả dự định ở trên không? Cảm ơn bạn đã dành thời gian.

Trả lời

4

WHERE khoản của bạn vì nó là chủ yếu là loại bỏ tất cả hồ sơ từ item_name mà không liên quan đến user_id 's 127 & 128.

Để khắc phục điều đó, giải pháp đơn giản nhất sẽ được LEFT JOIN từ item_name bảng tới bảng user_items và áp dụng lựa chọn user_id trên JOIN.

SELECT COUNT(*), itn.item_desc 
FROM item_name AS itn 
     LEFT OUTER JOIN user_items AS ui ON ui.item_id = itn.item_id 
              AND ui.user_id IN (127, 128) 
GROUP BY 
     itn.item_desc 

lưu ý rằng trong khi điều này có thể được viết như một RIGHT OUTER JOIN, tôi thấy rằng loại tham gia là phản trực giác và sẽ tư vấn trên chỉ sử dụng chúng khi thật cần thiết.

+1

+1. Hãy cẩn thận tại IN bí danh;) –

+1

Ah cảm ơn bạn rất nhiều, Lieven! Và cảm ơn nick, bí danh mẫu của tôi thật tệ, cảm ơn vì đã chỉ ra điều đó! – Tom

6

Có một lỗi nhỏ trong truy vấn của bạn bằng cách sử dụng tính. Những công việc này.

select count(ui.item_id) as total, in.item_desc 
from item_name `in` 
     left join user_items ui on ui.item_id = in.item_id 
             and ui.user_id in (127, 128) 
group by 
     in.item_desc 
order by total desc 
+0

Tôi không thấy lỗi? afaik, 'COUNT (*)' là SQL hợp lệ với bất kỳ sự sắp xếp 'GROUP BY' nào (ít nhất là trong SQL Server). –

+0

Nếu bạn kiểm tra truy vấn của bạn, bạn sẽ thấy rằng bạn sẽ có chuối 1.;) –

+0

Tôi không thể kiểm tra nó nhưng bây giờ tôi biết những gì bạn có ý nghĩa. Bạn đúng rồi. 1 cho điều đó. –

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