如何修复这个MySQL查询

时间:2011-11-03 04:09:22

标签: php mysql

目前我有一个系统,其中PHP脚本在加载页面时记录访问的一些信息(时间和“sid”)。

然后我使用:

SELECT *
FROM (
    SELECT COUNT(*), time
    FROM visit
    WHERE sid = $sid
    GROUP BY time
    ORDER BY time DESC
    LIMIT 14
) AS abc
ORDER BY time ASC

以相反的顺序获取过去两周的结果。

此查询的问题是,在没有访问的日子里,我没有得到结果:0, [time],而是没有。那些日子我怎么办才能得到零结果?它甚至可以在MySQL中使用,还是必须用PHP处理它?<​​/ p>

任何帮助都非常感谢!

2 个答案:

答案 0 :(得分:2)

您必须使用包含所有日期的第二个表(或使用如下所示的子查询)。因此,将表t的子查询扩展到CURDATE()-13过去14天。

SELECT COUNT(*),t.time FROM (
  SELECT CURDATE() AS time
  UNION
  SELECT CURDATE()-1 AS time
  UNION
  SELECT CURDATE()-2 AS time
  UNION
  SELECT CURDATE()-3 AS time
  UNION
  SELECT CURDATE()-4 AS time
  UNION
  [...]
) AS t
LEFT JOIN visit AS v ON t.time=v.time AND v.sid=$sid
ORDER BY t.time DESC

答案 1 :(得分:1)

首先,如果我没记错,子查询中的ORDER是没用的。

如果我使用PostgreSQL,我会使用generate_series()和外连接来获取缺少日期的0。不幸的是MySQL has no such concept。我建议使用填充日期的临时表