我需要这个用于图表目的。基本上我必须:
示例结果和相应的表格(此处简化)将是:
array(
'2012-05-26 00:00:00' => 1,
'2012-05-27 00:00:00' => 0, // Fake added row
'2012-05-28 00:00:00' => 2,
)
+----------------+----------------------+
| Table SMS | id | sent_at |
+----------------+----------------------+
| | 1 | 2012-05-26 21:58:41 |
+----------------+----------------------+
| | 2 | 2012-05-28 22:19:21 |
+----------------+----------------------+
| | 3 | 2012-05-28 02:19:21 |
+----------------+----------------------+
是否有任何SQL命令可以执行此操作,还是应该手动播放PHP数组?
答案 0 :(得分:4)
您可以使用UNION声明
SELECT
sent_at,
Count(*)
FROM (Select
id,
DATE(sent_at) as sent_at
FROM TableName
Group by Date(sent_at)
UNION ALL
Select
'0' as id,
DATE('2012-05-27') as sent_at) derived_table
Group By sent_at
<强>被修改强>
我建议创建一个特殊的表来加入。
创建查询日期表
CREATE TABLE DateTable (
DateValue DateTime,
Year Int,
Month Int,
Day Int)
现在使用您要查询的范围内的所有日期值填充此表。您可以使用任何有效日期轻松加入此表。允许您聚合已存在和不存在的日期。
答案 1 :(得分:1)
是的,我一直这样做
DROP PROCEDURE IF EXISTS `Example`;
DELIMITER $$
CREATE PROCEDURE `Example` (
$StartDate DATE,
$EndDate DATE
)
BEGIN
DECLARE $curDay DATE;
SET $StartDate = IFNULL($StartDate,'2000-01-01');
SET $curDay = $StartDate;
DROP TEMPORARY TABLE IF EXISTS `Day`;
CREATE TEMPORARY TABLE `Day`(
`Date` DATE
);
DaysLoop:LOOP
INSERT INTO
`Day`(`Date`)
SELECT
$curDay
;
SET $curDay = $curDay + INTERVAL 1 DAY;
IF
$curDay >= $EndDate OR $curDay >= NOW()
THEN
LEAVE DaysLoop;
END IF;
END LOOP DaysLoop;
SELECT
D.Date,
COUNT(S.id)
FROM
`Day` AS D
LEFT JOIN
`SMS` AS S
ON D.Date = DATE(S.sent_at)
GROUP BY
D.Date
ORDER BY
D.Date
;
END $$
DELIMITER ;
CALL Example('2012-01-01','2012-05-01');
我使用并推荐报告的存储过程,只需确保版本控制创建脚本等等。