2012-05-14 34 views
10

Tôi có SQL như thế này (nơi $ytoday là 5 ngày trước):Làm cách nào để có GROUP BY và COUNT bao gồm tổng số không?

$sql = 'SELECT Count(*), created_at FROM People WHERE created_at >= "'. $ytoday .'" AND GROUP BY DATE(created_at)'; 

Tôi muốn này để trả lại một giá trị cho mỗi ngày, vì vậy nó sẽ quay trở lại 5 kết quả trong trường hợp này (5 ngày trước đến ngày hôm nay) .

Nhưng giả sử Count(*) là 0 cho ngày hôm qua, thay vì trả lại số không, nó không trả lại bất kỳ dữ liệu nào cho ngày đó.

Làm cách nào tôi có thể thay đổi truy vấn SQLite đó để truy vấn cũng trả về dữ liệu có tổng số là 0?

+0

Chọn tất cả các hàng bạn muốn đầu tiên, sau đó chạy một số các hàng (trái tham gia có lẽ) – keyser

Trả lời

9

Nếu không có truy vấn phức tạp (theo ý kiến ​​của tôi), đầu ra dữ liệu thiết lập của bạn giành chiến thắng' t bao gồm các ngày không tồn tại trong bộ dữ liệu đầu vào của bạn. Điều này có nghĩa là bạn cần một tập dữ liệu với 5 ngày để tham gia.

Phiên bản đơn giản sẽ là tạo bảng có 5 ngày và tham gia vào đó. Tôi thường tạo và giữ (lưu bộ nhớ đệm hiệu quả) bảng lịch với mọi ngày tôi có thể cần. (Chẳng hạn như từ 1900-01-01 đến 2099/12/31.)

SELECT 
    calendar.calendar_date, 
    Count(People.created_at) 
FROM 
    Calendar 
LEFT JOIN 
    People 
    ON Calendar.calendar_date = People.created_at 
WHERE 
    Calendar.calendar_date >= '2012-05-01' 
GROUP BY 
    Calendar.calendar_date 
+0

Hmm, có vẻ đơn giản đủ. Điều này luôn luôn là 5 ngày qua, do đó, một bảng tĩnh sẽ không hoạt động. Suy nghĩ? – JBurace

+0

@JBurace - Một bảng tĩnh hoạt động. Bạn chỉ cần thay đổi mệnh đề WHERE của bạn. Ví dụ: tôi hiển thị "mỗi ngày kể từ' '2012-05-01'' "bởi vì tôi lười và không chỉ định phạm vi 5 ngày trong mệnh đề WHERE đó. Sau đó, bạn làm như bạn đã và đang xây dựng mệnh đề WHERE đó cho phù hợp với nhu cầu của bạn. – MatBailie

+0

Hmm được rồi. Tôi nghĩ rằng 'tạo một bảng với 5 ngày' có nghĩa là tạo ra một bảng chỉ với 5 mục. – JBurace

4

Bạn cần phải tham gia trái với danh sách ngày. Bạn có thể tạo ra một bảng với những ngày mà bạn cần trong nó, hoặc bạn có thể lấy cách tiếp cận năng động, tôi được nêu ở đây:

generate days from date range

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