2009-09-24 3 views
0

У меня есть сайт для загрузки файлов, и я хочу запустить сценарий обслуживания, который будет запускаться каждый день и удалять элементы, которые не были доступны через неделю. Я вхожу вид на каждый день, и каждый элемент в таблицу:Как перезаписать следующий запрос mysql

  • hit_itemid
  • hit_date
  • hit_views

Основная таблица на самом деле имеет те файлы, которые были загружены, для целей этот пример, его просто vid_id, vid_title thats в этой таблице, а vid_id будет равно hit_itemid.

У меня есть запрос следующим образом:

SELECT vid_id, 
     vid_title, 
     SUM(case when hit_date >= '2009-09-17' then hit_hits else 0 end) as total_hits 
    FROM videos 
    LEFT JOIN daily_hits ON vid_id = hit_itemid 
    WHERE vid_posttime <= '$last_week_timestamp' AND vid_status != 3 
    GROUP BY hit_itemid 
    HAVING total_hits < 1 

Но это всегда возвращает одну запись.

Как я могу переписать этот запрос?

ответ

0

первое предположение, может быть, вы должны сделать

GROUP BY vid_id 

вместо

GROUP BY hit_itemid 
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 & vid_status являются поля из таблицы видео

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' 
    ) 

Я предполагаю, что первая форма будет быстрее, но не может проверить (я не 't имеют доступ к вашим данным). Не проверял эти запросы, так же как и для .

Смежные вопросы