我有这个查询按日期计算表中的“视图”。它显然只给出了有活动的日期,但我希望我可以在一段选定的时间内获得MySQL返回数据。例如30天的30行,为没有匹配行的日期创建空数据。
我希望避免使用PHP来解决这个问题,所以我想我会在这里询问如何通过智能查询来实现这一目标。
QUERY:
SELECT count(ID) AS views, date AS view_date
FROM logging.views
WHERE date < DATE_SUB(NOW(),INTERVAL 30 DAY)
GROUP BY DAY(date)";
下面的示例仅给出了7行,显然是因为在所选的30天间隔中只有匹配7个不同日期的条目。我希望我能得到30行代表设定间隔内的所有日子。
输出:
Array
(
[0] => Array
(
[date] => 2010-09-01 22:04:19
[views] => 20
)
[1] => Array
(
[date] => 2010-08-13 00:15:54
[views] => 4
)
[2] => Array
(
[date] => 2010-08-24 17:46:53
[views] => 2
)
[3] => Array
(
[date] => 2010-08-25 07:18:11
[views] => 35
)
[4] => Array
(
[date] => 2010-08-26 08:02:47
[views] => 12
)
[5] => Array
(
[date] => 2010-08-27 09:56:05
[views] => 29
)
[6] => Array
(
[date] => 2010-08-28 12:46:17
[views] => 30
)
)
答案 0 :(得分:1)
SQL中的常见解决方案是创建一个包含30天的临时表,并将LEFT OUTER JOIN
创建到您的views
表。
SELECT COUNT(v.ID) AS views, d.date AS view_date
FROM logging.alldays d
LEFT OUTER JOIN logging.views v ON d.date = v.date
WHERE d.date < DATE_SUB(NOW(),INTERVAL 30 DAY)
GROUP BY d.date
或者将其作为非临时表并预先填充下一个100年的所有日子。这只是36525行,这对于RDBMS来说很容易。
但是,如果我想按小时或分钟查询怎么办?
然后,临时表方法可能会更容易。
基本上,SQL擅长将数据集连接到其他数据集 - 而不是将数据连接到空气中。所以你必须在某处创建一组数据才能加入它。
某些品牌的SQL数据库具有内置函数来生成表示某些有用值范围的短暂数据集。例如,PostgreSQL有generate_series()
。不幸的是,MySQL不提供这种功能。