在mySQL中显示所有日期,即使是那些数据为零的日期?

时间:2017-08-05 14:32:38

标签: php mysql

我的以下查询显示了每天(过去2天)发现的电子邮件的日期和计数

我的问题是,如果今天没有找到电子邮件,今天的日期将不会显示在输出上。 (如果昨天有电子邮件,它将只显示昨天日期和电子邮件的一行)。

如何编辑我的查询以始终显示2行,今天和昨天,日期和电子邮件数量甚至为零?

SELECT maildate, 
       COUNT(*) AS totalEmails 
FROM   emails 
WHERE  maildate >= Date_add(Curdate(), interval - 2 DAY) 
       AND company_id = 1 
GROUP  BY DATE(maildate) 
ORDER  BY maildate desc 

2 个答案:

答案 0 :(得分:0)

创建日期列表(或类似的数字序列)有很多技巧。我喜欢用MySQL的那个是使用@sqlvariables。我通常会从基准值开始,例如您的约会日期-2天。我将对数据库中的任何其他表进行交叉连接,该表至少具有您在输出中所期望的记录数量...说30天,或全年366天或更长。内部sql变量prep将继续增加任何增量(你甚至可以做日期范围,如开始/结束一周,一个月等)。现在,您可以获得所有可能日期的表格。

现在,我按值进行二次查询 - 在这种情况下是您的电子邮件日期并应用该组。使用此查询中的where子句将使IT更快,因为它可以在返回LEFT-JOIN到日期范围结果集之前利用其查询结果集上的日期。

现在,您的简单左​​连接将包含所有日期的两个部分以及那些确实存在的相应计数。

注意表别名" AnyTableWithAtLeast3RecordInIt"在" JustDates"查询实际上可能是您的电子邮件"表。由于我们不关心除了记录之外的任何标准,并且我们在我的示例中应用了30天的限制,因此它将是即时的。

$picurl = "profile_pic_resize/$get_id.jpg";      
$frame = imagecreatefrompng($cover_select);
$img = imagecreatefromjpeg($picurl);


imagealphablending($frame, false);
imagesavealpha($frame, true);

imagecopy($frame, $img, 20, 137, 0, 40, 130, 160); //have to play with these numbers for it to work for you, etc.

$getid = $_GET['id'];

imagepng($frame,"ready_pics/$getid.png");

imagedestroy($frame);
imagedestroy($img);

现在,根据您的查询判断,但未澄清的请求......您的电子邮件表格是否有未来日期?那是对的吗?如博士办公室和约会是为了将来,你想收到给定范围的电子邮件。这就是我所推断的,因此我的限制仅限于30天......如果你需要更长时间,只需延长LIMIT条款。

答案 1 :(得分:0)

您需要一个包含所需范围内所有日期的表格。如果只是今天和昨天,您可以轻松地将其创建为子查询(派生表)。

SELECT Curdate() as maildate
UNION ALL
SELECT Curdate() - INTERVAL 1 DAY

http://rextester.com/ALH50651

现在你可以LEFT JOIN你的表并计算行数:

SELECT sub.maildate, 
       COUNT(m.maildate) AS totalEmails
FROM (
    SELECT Curdate() as maildate
    UNION ALL
    SELECT Curdate() - INTERVAL 1 DAY
) sub
LEFT JOIN emails m 
  ON  DATE(m.maildate) = sub.maildate
  AND m.company_id = 1 
GROUP BY sub.maildate
ORDER BY sub.maildate desc