2013-05-19 35 views
8

Tôi có một bộ bài đăng hàng tháng. Bây giờ tôi cần một mảng chứa tổng số hồ sơ của các bài đăng được đăng trong mỗi tháng. Tôi đã thử dưới đây truy vấn MySql, làm việc tốt của nó, nhưng tôi đã mong đợi 0 (Zero) trong nhiều tháng mà không có hồ sơ. Ở đây nó không trở về 0.Số MySql() trả về 0 nếu không tìm thấy bản ghi nào

Tôi đọc rằng COUNT() sẽ không trả về '0', Vậy làm thế nào để tôi đạt được điều này?

Tôi đã thử IFNULL() và COALESCE() nhưng vẫn nhận được kết quả tương tự. Vui lòng trợ giúp với truy vấn này. Cảm ơn ......

SELECT 
count(id) as totalRec 
FROM ('post') 
WHERE year(date) = '2013' 
AND monthname(date) IN ('January', 'February', 'March') 
GROUP BY year(date)-month(date) 
ORDER BY 'date' ASC 

Got Kết quả:

+----------+ 
| totalRec | 
+----------+ 
|  7 | 
|  9 | 
+----------+ 

Kết quả dự kiến ​​(Trường hợp không có bài viết cho tháng Giêng):

+----------+ 
| totalRec | 
+----------+ 
|  0 | 
|  7 | 
|  9 | 
+----------+ 

mẫu dữ liệu:

+----+---------------------+ 
| id | date    | 
+----+---------------------+ 
| 24 | 2012-12-16 16:29:56 | 
| 1 | 2013-02-25 14:57:09 | 
| 2 | 2013-02-25 14:59:37 | 
| 4 | 2013-02-25 15:12:44 | 
| 5 | 2013-02-25 15:14:18 | 
| 7 | 2013-02-26 11:31:31 | 
| 8 | 2013-02-26 11:31:59 | 
| 10 | 2013-02-26 11:34:47 | 
| 14 | 2013-03-04 04:39:02 | 
| 15 | 2013-03-04 05:44:44 | 
| 16 | 2013-03-04 05:48:29 | 
| 19 | 2013-03-07 15:22:34 | 
| 20 | 2013-03-15 12:24:43 | 
| 21 | 2013-03-16 16:27:43 | 
| 22 | 2013-03-16 16:29:28 | 
| 23 | 2013-03-16 16:29:56 | 
| 11 | 2013-03-17 11:35:12 | 
+----+---------------------+ 
+1

bạn có thể cung cấp cho các hồ sơ mẫu, nơi chúng tôi có thể chơi với? –

+0

Nhóm của bạn trông không chính xác –

+0

@JW 웃 Tôi đã chỉnh sửa câu hỏi của mình với dữ liệu mẫu .. – sravis

Trả lời

15

Không có bản ghi nào cho tháng January đó là lý do tại sao bạn không nhận được kết quả nào. Một giải pháp hoạt động là bằng cách tham gia một truy vấn phụ có chứa danh sách các tháng mà bạn muốn được hiển thị trong danh sách.

SELECT count(b.id) as totalRec 
FROM (
      SELECT 'January' mnth 
      UNION ALL 
      SELECT 'February' mnth 
      UNION ALL 
      SELECT 'March' mnth 
     ) a 
     LEFT JOIN post b 
      ON a.mnth = DATE_FORMAT(b.date, '%M') AND 
       year(b.date) = '2013' AND 
       DATE_FORMAT(b.date, '%M') IN ('January', 'February', 'March') 
GROUP BY year(b.date)-month(b.date) 
ORDER BY b.date ASC 

OUTPUT

╔══════════╗ 
║ TOTALREC ║ 
╠══════════╣ 
║  0 ║ 
║  7 ║ 
║  9 ║ 
╚══════════╝ 
+0

. tôi cũng chuẩn bị làm một câu đố sql. nhưng bạn đánh bại tôi với nó - như thường lệ :) +1 – luksch

+0

WOW, Cảm ơn rất nhiều. Tôi đã cố gắng từ 1 giờ qua để có được kết quả này, Cuối cùng bạn đã tiết kiệm thời gian của tôi. Cảm ơn bạn rất nhiều .. – sravis

+0

@JW Tôi đã thêm tháng Tư vào danh sách lựa chọn trong ví dụ JSfiddle của bạn, do đó kết quả sẽ là [0,7,9,0] nhưng hiển thị [0,7,9]. Bạn có thể vui lòng xem nó một lần không? http://www.sqlfiddle.com/#!2/e0a6e/15 – sravis

3

Bạn đã thử IFNULL() đúng cách ? Có thể thử IFNULL(Count(id), 0) trong mệnh đề SELECT khi tham gia.

3

COALESCE là những gì bạn có thể sử dụng, nếu bạn có bảng ngày tháng và đã tham gia trái với nó. Nó đi từ trái sang phải để trả về giá trị không null đầu tiên. Nhóm của bạn trông hơi hấp dẫn vào phút, tôi đã điều chỉnh nó.

SELECT 
COALESCE(count(id),0) as totalRec 
FROM ('post') 
LEFT JOIN dates 
ON dates.date = post.date 
WHERE year(date) = '2013' 
AND monthname(date) IN ('January', 'February', 'March') 
GROUP BY month(date), year(date) 
ORDER BY 'date' ASC 

đâu ngày bảng là ..

DATE 
2013-01-01 
2013-01-02 
2013-01-03 
etc.... 

Xem ở đây: http://easywebapps.blogspot.co.uk/2011/07/mysql-how-to-create-calendar-table.html

+0

Tôi đã thử truy vấn của bạn và tôi vẫn nhận được kết quả tương tự – sravis

+0

Rất tiếc, tôi đã bỏ lỡ bit tạo bảng ngày, điều đó quan trọng là –

1

Nếu tập hợp kết quả không có bài viết trong khoảng thời gian, bạn sẽ không nhận được bất kỳ kết quả để đếm, do đó tại sao nó không hiển thị.

Bạn cần tham gia vào một bảng khác có tất cả các tháng trong năm hoặc điền dữ liệu theo chương trình khi kết quả được trả về. Tôi không thể nghĩ ra một cách khác để làm điều này, nhưng có lẽ điều đó là có thể.

Ngoài ra, như những người khác đã nói, tách nhóm bằng dấu phẩy.

0

Tôi nghĩ rằng bạn chỉ cần truy vấn như

SELECT COALESCE(COUNT(id),0) AS totid FROM table 

vb ví dụ này

Set count=Con.Execute("SELECT COALESCE(COUNT(id),0) AS totid FROM table") 

sau đó viết

<%=count("totid")%> 
Các vấn đề liên quan