列出没有数据库数据的月份

时间:2015-04-02 18:53:39

标签: php html mysql sql

当前查询工作完美的问题是当前月份(4月)没有数据,因此它没有将月份列为0,如何将月份列为0个interivews?

QUERY

select distinct from_unixtime(interv_date,'%M %Y') AS month, count(*) as totals
from " . TABLE_PREFIX . "interviews
group by month
order by interv_date desc
limit 6

请注意,interv_date列是一个纪元时间戳(例如:1428003691)

PHP

<table class=\"highchart\" data-graph-container=\"#graphcontainer\" data-graph-type=\"column\" data-graph-legend-disabled=\"1\">
<caption>Interviews by Month</caption>
<thead>
<tr>
<th>Month</th>
<th>Totals</th>
</tr>
</thead>
<tbody>
<?php
for ($i = 0; $i < $stat_logs["count"]; $i++) {
    echo "<tr>\n";
    echo "<td>" . $stat_logs[$i]["month"] . "</td>\n";
    echo "<td>" . $stat_logs[$i]["totals"] . "</td>\n";
    echo "</tr>\n";
}
?>
echo "</tbody>
echo "</table>

输出

Month           Totals
March 2015      7
February 2015   5
January 2015    12
December 2014   18
November 2014   19
October 2014    5

我需要它输出这样的东西:

Month           Totals
April 2015      0
March 2015      7
February 2015   5
January 2015    12
December 2014   18
November 2014   19

请注意,不是每个月都会有采访,所以它不会只是当月(第一个月) 如何在没有采访的情况下获得这些月份的任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

我已经在这个WAAAAAYYYY工作太久了。但这是一个开始...... http://sqlfiddle.com/#!9/23389/2

它运作得非常好,但它有点笨重,有两个临时表。但是没有硬编码日期!这些表实际上应该是临时表,虽然sqlfiddle没有使用临时表,所以我把它们变成了真正的表。

-- Get a table with the months of interest in it
SET @RightNow = curdate();
create table LastSixMonths (dateVal datetime);
Insert into LastSixMonths values(@RightNow);
Insert into LastSixMonths values(@RightNow - INTERVAL 1 MONTH);
Insert into LastSixMonths values(@RightNow - INTERVAL 2 MONTH);
Insert into LastSixMonths values(@RightNow - INTERVAL 3 MONTH);
Insert into LastSixMonths values(@RightNow - INTERVAL 4 MONTH);
Insert into LastSixMonths values(@RightNow - INTERVAL 5 MONTH);

-- Summarize the recent interviews
create table Totals (monthAndYear varchar (20), interviews int);
Insert into Totals
select distinct from_unixtime(intv.interv_date,'%M %Y') as monthAndYear, 
                count(*) 
from interviews intv 
group by from_unixtime(intv.interv_date,'%M %Y')
order by interv_date desc
limit 6

-- Do a left join on recent months and summarized interviews
select date_format(six.dateval, '%M %Y'), 
    IF (interviews IS NULL, 0, Interviews) as totalInterviews
from LastSixMonths six 
left join Totals tot 
    on date_format(six.dateval, '%M %Y') = tot.monthAndYear
order by six.dateval desc
limit 6;