【问题标题】:Obtaining the most recent records in a table of transactions获取事务表中的最新记录
【发布时间】:2011-11-08 17:16:29
【问题描述】:

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

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

有问题的表格如下:

+---------------+-----------------------------+------+-----+-------------------+-------+
| 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 年了,我已经很生疏了。任何帮助将不胜感激!

【问题讨论】:

    标签: mysql join subquery composite-key


    【解决方案1】:
    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 组合),您需要做一些更复杂的事情。

    【讨论】:

    • 太棒了!非常感谢,我为此苦苦挣扎了几天,我变得非常沮丧。我需要回过头来更清楚地查看我的 JOIN 类型。在大学的 DB 课上,我曾经能够像没有人一样做这些事情,但从那以后我就再也没有碰过它,并且失去了一切。我觉得很缺!再次感谢。
    【解决方案2】:

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

    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)
    

    【讨论】:

      猜你喜欢
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多