如何解决这个MySQL查询
问题描述:
目前我有一个系统,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来处理它?
任何帮助非常感谢!
答
您必须使用包含所有日期的第二个表(或使用下面的子查询)。因此,延长表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
答
首先,如果我没记错的话,子查询中的ORDER是无用的。
如果我使用的是PostgreSQL,我会使用generate_series()和outer join来获得缺少日期的0。不幸的是MySQL has no such concept。我建议使用填充日期的临时表格
+0
'ORDER BY'子查询是有用的 - 事实上:希望 - 当有'LIMIT'。 –
你可能需要'Union'在这种情况下.... –