2010-05-10 41 views
5

Tôi đang cố tạo câu lệnh SELECT với mệnh đề GROUP BY, sẽ trả về "giá trị mặc định".SQL GROUP BY với "giá trị mặc định"

Imagine bảng MySQL đơn giản sau đây:

CREATE TABLE `tracker` (
    `id` INTEGER PRIMARY KEY auto_increment, 
    `date` DATETIME NOT NULL, 
    `customer_id` INTEGER NOT NULL 
); 

Bảng này chứa chỉ có một kỷ lục:

INSERT INTO `tracker` (`date`, `customer_id`) VALUES('2010-05-03', 1); 

Sau phường Tôi đang thực hiện truy vấn SQL sau:

SELECT DATE(`date`), COUNT(customer_id) FROM tracker 
WHERE DATE(`date`) >= '2010-05-01' AND DATE(`date`) <= '2010-05-05' 
GROUP BY DATE(`date`) ORDER BY DATE(`date`); 

Và nhận được tập hợp kết quả mong đợi:

+----+---------------------+-------------+ 
| id | date    | customer_id | 
+----+---------------------+-------------+ 
| 1 | 2010-05-10 00:00:00 |   1 | 
+----+---------------------+-------------+ 

Tuy nhiên, tôi muốn tập hợp kết quả tìm kiếm như thế này:

+--------------+--------------------+ 
| DATE(`date`) | COUNT(customer_id) | 
+--------------+--------------------+ 
| 2010-05-01 |     0 | 
| 2010-05-02 |     0 | 
| 2010-05-03 |     1 | 
| 2010-05-04 |     0 | 
| 2010-05-05 |     0 | 
+--------------+--------------------+ 

Có thể để đạt được hành vi này?

+2

Có một vài bản sao có cùng chủ đề này, ví dụ: http://stackoverflow.com/questions/400759/sql-group-by-date-but-get-dates-wo-rec ords-too – Unreason

Trả lời

3

Bạn có thể xây dựng một bảng tạm thời của ngày có hiệu lực trong phạm vi và sau đó kết hợp đó vào truy vấn của bạn - đó là về cách duy nhất phía trước mà tôi có thể thấy ngay ...

Martin

1

Như Martin cho biết, giải pháp tốt nhất là tạo một bảng tạm thời với ngày tháng.

Sau đó có 2 phương pháp:

  • Do một bên ngoài tham gia với bảng temp và làm một group by vào kết quả, OR

  • group by trên bảng gốc + UNION select date,0 as count from date_table d where not exists (select 1 from customer c where c.date=d.date)

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