我的以下查询显示了每天(过去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
答案 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
现在你可以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