获取事务表中的最新记录

时间:2011-11-08 17:16:29

标签: mysql join subquery composite-key

我正在尝试对我们保留的关于数据库记录方面的事务的表运行查询。更具体地说,当我们“过期”“资产”(我们称之为)时,我们将其状态更改为在主表中过期,然后记录其在另一个过期时的记录(这不是我的设计) )。

问题是,有时最终用户对前端不耐烦,我们最终会为另一个表中的特定记录发布多个过期事务。

有问题的表格如下:

+---------------+-----------------------------+------+-----+-------------------+-------+
| 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.

我知道它涉及带连接的子查询,(或者可能不是?)但是自从我使用MySQL以来已经有5年了,而且我非常生疏。任何帮助将不胜感激!!

2 个答案:

答案 0 :(得分:0)

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

n.b。如果您有重复的date_expired值(针对特定的m_id, a_ordinal组合),则需要执行更复杂的操作。

答案 1 :(得分:0)

我相信您需要加入子查询来执行此操作...尝试以下操作:

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)