2010-03-08 24 views
5

Tôi muốn để có được các dữ liệu mỗi ngày trong vòng một năm lạc hậu nhưng tôi phải sử dụng 365 truy vấn cho mỗi ngày như:Làm cách nào để chỉ sử dụng một truy vấn để nhận dữ liệu mỗi ngày trong vòng một năm?

for ($i = 0; $i<365; $i++){ 
    $end_day = ...; // the end time of each day 
    $start_day = ...; // the start time of each day 
    $query = select count(*)....where created < $end_day AND created > $start_day 
} 

Tôi nghĩ rằng giải pháp hiện tại của tôi làm cho hệ thống rất chậm. Có cách nào để chỉ sử dụng một truy vấn không?

Trả lời

4

Giả sử cột tạo của bạn là một DATETIME hoặc dấu thời gian, và các dữ liệu lưu trữ được chi tiết hơn so với một ngày:

SELECT COUNT (*) ... GROUP BY NĂM (tạo ra), MONTH (tạo ra), DAY (tạo)

COUNT là hàm tổng hợp và sẽ áp dụng cho mỗi nhóm, nghĩa là bạn sẽ có một hàng cho mỗi nhóm và hàng đó sẽ có số lượng bản ghi trong nhóm đó. Vì chúng tôi đã tạo nhóm mỗi ngày, đây là dữ liệu bạn muốn.

Bạn không thể chỉ nhóm theo DAY (được tạo) khi DAY trả về ngày trong tháng, vì vậy chúng tôi cũng cần đặt tháng và năm để đảm bảo ngày riêng biệt.

Bạn có thể muốn có một WHERE được tạo> $ bắt đầu VÀ đã tạo < $ kết thúc để giới hạn nó thành một khoảng thời gian (hoặc WHERE YEAR (được tạo) == 2010).

Tài liệu tham khảo:

MySQL Query GROUP BY day/month/year

http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html

1

Nếu đó là một cột datetime đã:

SELECT COUNT(*),DATE(created) as d ..... GROUP BY d; 

Nếu đó là được lưu trữ dưới dạng dấu thời gian unix:

SELECT COUNT(*),DATE(FROM_UNIXTIME(created)) as d ..... GROUP BY d; 

Về cơ bản, bạn có thể sử dụng Mysql Date and Time functions để định dạng cột sao cho bạn chỉ nhận được một ngày trong số đó và sau đó nhóm theo những ngày đó để nhận số đếm cho mỗi ngày.

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