Получение самых последних записей в таблице транзакций - PullRequest
0 голосов
/ 08 ноября 2011

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

Проблема в том, что иногда конечный пользователь теряет терпение по отношению к внешнему интерфейсу, и в результате мы получаем несколько транзакций с истекшим сроком действия для определенной записи из другой таблицы.

Соответствующая таблицавыглядит следующим образом:

+---------------+-----------------------------+------+-----+-------------------+-------+
| Field         | Type                        | Null | Key | Default           | Extra |
+---------------+-----------------------------+------+-----+-------------------+-------+
| m_id          | int(11)                     | NO   | PRI | 0                 |       | 
| a_ordinal     | int(11)                     | NO   | PRI | 0                 |       | 
| date_expired  | datetime                    | NO   | PRI |                   |       | 
| expire_state  | enum('EXPIRED','UNEXPIRED') | YES  |     | NULL              |       | 
| note          | text                        | YES  |     | NULL              |       | 
| created_by    | varchar(40)                 | YES  |     | NULL              |       | 
| creation_date | datetime                    | NO   |     |                   |       | 
| updated_by    | varchar(40)                 | NO   |     |                   |       | 
| last_update   | timestamp                   | NO   |     | CURRENT_TIMESTAMP |       | 
+---------------+-----------------------------+------+-----+-------------------+-------+

Из того, что я могу установить, m_id, a_ordinal и date_expired образуют составной ключ.

Мне нужен запрос к таблице для отображения самая последняя транзакция для каждой просроченной записи (m_id, a_ordinal, expired_date).В настоящее время он отображает 809 записей, но это потому, что у нас может быть несколько случаев истечения срока действия записи:

|      2223 |      20 | 2011-05-02 12:15:43 | EXPIRED      | 165 Plays. Program quality is poor. 
|      2223 |      20 | 2011-05-02 12:16:05 | EXPIRED      | 165 Plays. Program quality is poor.

Я знаю, что это включает подзапрос с объединением (или, возможно, нет?), Но этоПрошло 5 лет с тех пор, как я работал с MySQL, и я очень ржавый.Любая помощь будет оценена !!

Ответы [ 2 ]

0 голосов
/ 08 ноября 2011

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

SELECT
 yt.m_id, 
 yt.a_ordinal, 
 yt.date_expired
FROM 
 yourtable yt 
 INNER JOIN ( 
  SELECT m_id, a_ordinal, MAX(date_expired) as `max_date`
  FROM yourtable
  GROUP BY m_id, a_ordinal) dt 
 ON (yt.m_id = dt.m_id AND yt.a_ordinal = dt.a_ordinal AND yt.date_expired = dt.max_date)
0 голосов
/ 08 ноября 2011
SELECT t.m_id, t.a_ordinal, t.date_expired, t.note
FROM expiry_table_name t
INNER JOIN  (
    SELECT m_id, a_ordinal, MAX(date_expired) AS date_expired
    FROM expiry_table_name
    GROUP BY m_id, a_ordinal
    ) g
ON g.m_id = t.m_id
AND g.a_ordinal = t.a_ordinal
AND g.date_expired = t.date_expired

nb Если у вас есть дубликаты date_expired значений (для конкретной комбинации m_id, a_ordinal), вам нужно сделать что-то более сложное.

...