如何重写以下mysql查询

时间:2009-09-24 22:04:27

标签: sql mysql

我有一个文件上传站点,我想运行一个每天运行的维护脚本,并删除一周内未访问过的项目。我将每天的视图和每个项目记录到表格中:

  • hit_itemid
  • hit_date
  • hit_views

主表实际上包含已上传的文件,就本示例而言,此表中只有vid_idvid_title,而vid_id将等于{{ 1}}。

我的查询如下:

hit_itemid

但这总是会返回一条记录。

如何重写此查询?

4 个答案:

答案 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)

你肯定有满足这个标准的数据吗?您只考虑在某个时间戳之前创建的视频行以及某种状态 - 这可能会将您的结果集限制为只有一个视频匹配的位置。