2013-11-07 3 views
1

я пытаюсь написать запрос SQL, чтобы найти последнюю запись для каждой группы является расположение моего стола:извлечь последнюю запись для каждой группы соблюдая некоторые критерии

-------------------------------------- 
| id | Group | message | Status | date| 
------------------------------------- 
| 1 | A  | msg1 | sent | dt | 
------------------------------------- 
| 2 | A  | msg2 |deferred| dt2 | 
------------------------------------- 
| 3 | B  | msg3 |deferred| dt | 
------------------------------------- 
| 4 | B  | msg4 |deferred| dt | 
------------------------------------- 
| 5 | B  | msg5 |Bounced | dt | 
------------------------------------- 
| 6 | C  | msg6 |sent | dt | 
------------------------------------- 
| 7 | D  | msg7 |deferred| dt | 
------------------------------------- 
| 8 | D  | msg8 |deferred| dt | 
------------------------------------- 
| 9 | D  | msg9 |sent | dt | 
------------------------------------- 

И я стараюсь, чтобы получить это выход:

-------------------------------------- 
| id | Group | message | Status | date| 
------------------------------------- 
| 2 | A  | msg2 |deferred| dt | 
------------------------------------- 
| 5 | B  | msg5 |bounced | dt | 
------------------------------------- 
| 8 | D  | msg8 |deferred| dt | 
------------------------------------- 

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

SELECT ee.Group, ee.message 
FROM email_errors ee 
LEFT JOIN email_errors ee2 ON (ee.Group = ee2.Group 
AND ee.id < ee2.id) 
WHERE ee2.id IS NULL 
AND ee2.status <>0 

выделю ee.status <> 0, потому что в моей реальной таблице я заменил 3 возможный статус бушель 0,1,2, и я заменил посланный статус 0.

+0

Да, я вижу, но здесь я заблокирован, потому что мне нужно выбрать последнюю запись в зависимости от статуса, который у меня есть, и даты, и это то, что я не знаю, как написать его – Ahmadhc

+0

Нет дат в вашем столе. – Strawberry

ответ

1

Я хотел бы сделать следующее:

SELECT ee.* 
FROM email_errors as ee 
CROSS JOIN 
(
    SELECT ee.Group as grp, MAX(ee.id) AS max_id 
    FROM email_errors as ee 
    CROSS JOIN 
    (
     SELECT Group as grp, MAX(date_t) AS max_date 
      FROM email_errors 
      WHERE status <> 0 
      GROUP BY Group 
    ) aux 
    WHERE ee.Group = aux.grp 
    AND ee.date_t = aux.max_date 
    GROUP BY ee.Group 
) outer_aux 
WHERE ee.Group = outer_aux.grp 
AND ee.id = outer_aux.max_id 
1

Обратите внимание, что group зарезервированное слово в MySQL - так не хорошее название для колонны ...

SELECT x.* 
    FROM email_errors x 
    JOIN 
    (SELECT email_group 
      , MAX(id) max_id 
     FROM email_errors 
     WHERE status IN ('deferred','bounced') 
     GROUP 
      BY email_group 
    ) y 
    ON y.email_group = x.email_group 
    AND y.max_id = x.id; 
+0

Этот запрос не содержит условия в дате. @Ahmadhc: cronology записей в вашей таблице основывается на ID или на дате? –

+0

Нет, я использую дату для определения моей последней записи. @AndreiNicusan ваше право. – Ahmadhc

+0

В вашем примере ваши * даты * - это все строки со значением 'dt'. Я не могу с этим работать. Этот запрос является оптимальным решением. Измените его по мере необходимости. – Strawberry

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