2011-11-03 92 views
1

目前我有一个系统,PHP脚本在加载页面时记录一些访问的信息(时间和“sid”)。如何解决这个MySQL查询

然后我用:

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来处理它?

任何帮助非常感谢!

+0

你可能需要'Union'在这种情况下.... –

回答

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

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

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

+0

'ORDER BY'子查询是有用的 - 事实上:希望 - 当有'LIMIT'。 –