我有一个文件上传站点,我想运行一个每天运行的维护脚本,并删除一周内未访问过的项目。我将每天的视图和每个项目记录到表格中:
hit_itemid
hit_date
hit_views
主表实际上包含已上传的文件,就本示例而言,此表中只有vid_id
,vid_title
,而vid_id
将等于{{ 1}}。
我的查询如下:
hit_itemid
但这总是会返回一条记录。
如何重写此查询?
答案 0 :(得分:1)
一个想法:
SELECT DISTINCT
vid_id, vid_title
FROM
videos v
LEFT JOIN daily_hits dh ON (
v.vid_id = dh.hit_itemid AND dh.hit_date >= '2009-09-17'
)
WHERE
v.vid_posttime <= '$last_week_timestamp' AND v.vid_status != 3
AND dh.hit_itemid IS NULL;
或者(基准来看哪个更快):
SELECT
vid_id, vid_title
FROM
videos v
WHERE
v.vid_posttime <= '$last_week_timestamp' AND v.vid_status != 3
AND NOT EXISTS (
SELECT 1 FROM daily_hits dh
WHERE v.vid_id = dh.hit_itemid AND dh.hit_date >= '2009-09-17'
)
我猜第一种形式会更快,但不能检查(我没有 有权访问您的数据)。还没有测试过这些查询 同样的原因。
答案 1 :(得分:0)
首先猜测,可能是你必须做一个
GROUP BY vid_id
而不是
GROUP BY hit_itemid
答案 2 :(得分:0)
SELECT
vd.vid_id,
vd.vid_title,
sum(case when dh.hit_date >= '2009-09-17' then dh.hit_views else 0 end) as total_hits
FROM videos vd
LEFT JOIN daily_hits dh ON dh.hit_itemid = vd.vid_id
WHERE vd.vid_posttime <= '$last_week_timestamp' AND vd.vid_status != 3
GROUP BY vd.vid_id
HAVING total_hits < 1
这就是我的查询方式...假设vid_posttime&amp; vid_status是表格视频的字段
答案 3 :(得分:0)
你肯定有满足这个标准的数据吗?您只考虑在某个时间戳之前创建的视频行以及某种状态 - 这可能会将您的结果集限制为只有一个视频匹配的位置。