Выберите самые последние элементы с двойными значениями - PullRequest
0 голосов
/ 19 сентября 2011

Учитывая следующую информацию, как я могу выбрать самые последние позиции (на основе time_entered) для уникальных params и cron_action_id пар, которые не были выполнены?

cron_schedule

enter image description here

Например, идентификаторы 1, 2 и 4 имеют одинаковые params и cron_action_id, поэтому мне не нужно выбирать все 3, только идентификатор 4. Тот же принцип для идентификатора3/5 и 7 / 8.

Я могу получить только до

SELECT *
FROM cron_schedule cs
INNER JOIN cron_actions ca
ON cs.cron_action_id = ca.cron_action_id
WHERE time_executed = 0
-- GROUP BY (params, cron_action_id) ?

Это должно вернуть строки с id 4, 5, 6 и 8

Спасибо

Ответы [ 2 ]

1 голос
/ 19 сентября 2011
SELECT t1.* 
FROM   cron_schedule t1 
  INNER JOIN (SELECT params, 
    cs.cron_action_id, 
    Max(time_entered) AS time_entered 
    FROM cron_schedule cs 
    INNER JOIN cron_actions ca 
    ON cs.cron_action_id = ca.cron_action_id 
    WHERE  time_executed = 0 
    GROUP  BY params, cron_action_id) AS t2 
  ON t1.params = t2.params 
    AND t1.cron_action_id = t2.cron_action_id 
    AND t1.time_entered = t2.time_entered 
  INNER JOIN cron_actions ca2 
  ON t1.cron_action_id = ca2.cron_action_id 
  WHERE  t1.time_executed = 0 
0 голосов
/ 19 сентября 2011

Не проверено, но эта основная идея должна работать:

SELECT *
FROM
    cron_schedule outer_cron_schedule JOIN cron_actions
WHERE
    time_entered = (
        SELECT MAX(time_entered)
        FROM cron_schedule inner_cron_schedule
        WHERE
            outer_cron_schedule.id = inner_cron_schedule.id
        GROUP BY
            params, cron_action_id
    )
    AND time_executed = 0

Попробуйте

...