Php 从mysql返回0的计数;计数();

Php 从mysql返回0的计数;计数();,php,mysql,count,limit,Php,Mysql,Count,Limit,我在mysql上运行以下查询 SELECT DATE(field) AS day, COUNT( * ) AS totalSessions FROM table GROUP BY DATE(field) ORDER BY field DESC LIMIT 7 它回来了 day | totalSessions 2013-12-17 | 5 2013-12-15 | 1 为了得到结果,我需要对查询进行哪些更改 day | totalSessions

我在mysql上运行以下查询

SELECT DATE(field) AS day, COUNT( * ) AS totalSessions
FROM table
GROUP BY DATE(field) 
ORDER BY field DESC 
LIMIT 7
它回来了

day        |   totalSessions
2013-12-17 |   5
2013-12-15 |   1
为了得到结果,我需要对查询进行哪些更改

day        |  totalSessions
2013-12-17 |  5
2013-12-16 |  0
2013-12-15 |  1
2013-12-14 |  0
2013-12-13 |  0
2013-12-12 |  0
2013-12-11 |  0
你可能需要(在某处)存储你想要返回的日期。我认为存储过程可以帮助您:

delimiter $$
create procedure getStuff(d0 date, d1 date)
begin
    declare d date;
    drop table if exists temp_dates;
    create temporary table temp_dates (
         d date not null primary key
    );
    set d = d0;
    while d <= d1 do
        insert into temp_dates values (d);
        set d = date_add(d, interval +1 day);
    end while;
    select 
        a.d as day,
        count(b.field) as totalSessions
    from
        temp_dates as a
        left join yourTable as b on a.d = b.dateField -- Assuming "dateField" holds the date
    group by
        a.d;
end $$
delimiter ;
分隔符$$
创建过程getStuff(d0日期,d1日期)
开始
宣布终止日期;
如果存在临时日期,则删除表格;
创建临时表temp_dates(
d日期不为空主键
);
设置d=d0;

虽然d不是最好的解决方案,但值得一试:

SELECT 
    FAKE.dt, 
    COUNT(YT.id) AS totalSessions 
FROM (
    SELECT DATE(NOW()) as dt
    UNION SELECT DATE(DATE_SUB(NOW(), INTERVAL 1 DAY)) as dt
    UNION SELECT DATE(DATE_SUB(NOW(), INTERVAL 2 DAY)) as dt
    UNION SELECT DATE(DATE_SUB(NOW(), INTERVAL 3 DAY)) as dt
    UNION SELECT DATE(DATE_SUB(NOW(), INTERVAL 4 DAY)) as dt
    UNION SELECT DATE(DATE_SUB(NOW(), INTERVAL 5 DAY)) as dt
    UNION SELECT DATE(DATE_SUB(NOW(), INTERVAL 6 DAY)) as dt
) FAKE
LEFT JOIN yourtable YT ON YT.datefield = FAKE.dt
GROUP BY FAKE.dt
ORDER BY FAKE.dt DESC

因此,从今天开始向后选择7个日期,合并结果,左键连接所需数据,按日期分组和排序。

您的表中是否有2013-12-16、2013-12-14等条目?@Robbert否没有。我希望能找到一种方法,将
NULL
会话转换为0 sessionleft,并将其自身加入表中。您不能拥有您没有的条目的数据(即:不存在任何与之相关的日期)。您可以采用繁琐的方法(编写一个存储过程,创建一个包含所有日期的临时表,并连接到该临时表),也可以采用简单的方法:在日历表中预先填充从第一个日期到您设想需要的最后一个日期的所有可能日期,然后连接。@Mihai-如果日期不在表中,那么将表与自身连接将如何产生所需的结果?记住:临时表仅对创建它们的连接可见。