2013-08-23 25 views
9

Tôi đang định hình một truy vấn để cung cấp số lượng báo cáo được gửi trong năm qua được sắp xếp theo ngày. tôi nhận được năm nay và tháng với php:Làm thế nào để có được một số ngay cả khi không có kết quả mysql tương ứng?

$year = date('Y') - 1; 
$month = date('m'); 

và thực hiện các truy vấn sau đây: SQL:

SELECT month(date_lm) AS `month` , 
count(*) AS `count` 
FROM `reports` 
WHERE (status = 'submitted') 
AND (date_lm > 2012-08) 
GROUP BY month(date_lm) 
ORDER BY month(date_lm) ASC 

Và vì chỉ có được 1 nộp trong năm ngoái nó chỉ mang lại cho tôi 1 kết quả ...

| month | count | 
| 7 | 1 | 

Nhưng tôi muốn kết quả thiết lập để hiển thị:

| month | count | 
| 9 | 0 | 
| 10 | 0 | 
| 11 | 0 | 
| 12 | 0 | 
| 1 | 0 | 
| 2 | 0 | 
| 3 | 0 | 
| 4 | 0 | 
| 5 | 0 | 
| 6 | 0 | 
| 7 | 1 | 
| 8 | 0 | 

Điều đó có khả thi không?

Trả lời

2

Bạn nên LEFT JOIN bảng này với 1..12 bảng. Something như thế này:

SELECT Months.id AS `month` , 
COUNT(`reports`.date_lm) AS `count` 
FROM 
(
    SELECT 1 as ID UNION SELECT 2 as ID UNION SELECT 3 as ID UNION SELECT 4 as ID 
    UNION 
    SELECT 5 as ID UNION SELECT 6 as ID UNION SELECT 7 as ID UNION SELECT 8 as ID 
    UNION 
    SELECT 9 as ID UNION SELECT 10 as ID UNION SELECT 11 as ID UNION SELECT 12 as ID 
) as Months 
LEFT JOIN `reports` on Months.id=month(`reports`.date_lm) 
         AND 
         (status = 'submitted') 
         AND (date_lm > 2012-08) 
GROUP BY Months.id 
ORDER BY Months.id ASC 

SQL Fiddle demo

+0

Xin cảm ơn, Điều này có vẻ hợp pháp nhưng tôi nhận được một báo cáo FUNCTION. không tồn tại.Kiểm tra với phân tích cú pháp tên chức năng và độ phân giải. – surfer190

+0

@StevieG: thử truy vấn cố định – valex

+0

Nó hiện đang hoạt động, nhưng đầu ra vẫn không xuất ra các tháng 9 đến 8. Vì vậy, chỉ khi một hàng đáp ứng các điều kiện được thêm vào. Vì vậy, không có số nào có số 0. – surfer190

3

Để thực hiện việc này, bạn có thể tạo bảng 'tháng' và sau đó sử dụng phép nối ngoài bên trái giữa bảng đó và bảng báo cáo.

Tôi chưa bao giờ sử dụng mysql nên xin lỗi nếu cú ​​pháp là hơi bị sai, nhưng điều này sẽ được truy vấn:

SELECT months.monthNumber, 
    count(reports.id) AS `count` 
FROM `months` left outer join `reports` on months.monthNumber = month(reports.date_lm) 
WHERE (status = 'submitted') 
AND (date_lm > 2012-08) 
GROUP BY monthNumber 
ORDER BY monthNumber ASC 

Quan trọng hơn, các tính nên có một cột trong bảng báo cáo, không phải là tháng bảng, nếu không bạn sẽ không bao giờ nhận được số không.

0

Hy vọng điều này có thể giúp ..

SELECT t1.month_year AS month, COALESCE(SUM(t1.total+t2.total), 0) AS count FROM ( SELECT DATE_FORMAT(a.Date, "%Y-%m") AS md, DATE_FORMAT(a.Date, "%b-%y") AS month_year, '0' AS total FROM ( SELECT curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY AS Date FROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c ) a WHERE a.Date <= NOW() AND a.Date >= Date_add(Now(),INTERVAL - 11 MONTH) GROUP BY md )t1 LEFT JOIN ( SELECT DATE_FORMAT(created_at, "%b") AS month, COUNT(*) AS total ,DATE_FORMAT(created_at, "%Y-%m") AS md FROM reports WHERE created_at <= NOW() AND created_at >= Date_add(Now(),INTERVAL - 11 MONTH) AND tình trạng = 1 GROUP BY md )t2 ON t2.md = t1.md LEFT JOIN ( SELECT DATE_FORMAT(date_lm, "%b") AS month, COUNT(*) AS total ,DATE_FORMAT(date_lm, "%Y-%m") AS md FROM tbl_users WHERE date_lm <= NOW() AND date_lm >= Date_add(Now(),INTERVAL - 11 MONTH) AND status = 'submitted' GROUP BY md )t3 ON t3.md = t1.md GROUP BY t1.md ORDER BY t1.md

này sẽ cung cấp cho dữ liệu trong vòng 12 tháng qua ngay cả khi không có dữ liệu cho nó với 0 ..

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