我正在尝试对我们保留的关于数据库记录方面的事务的表运行查询。更具体地说,当我们“过期”“资产”(我们称之为)时,我们将其状态更改为在主表中过期,然后记录其在另一个过期时的记录(这不是我的设计) )。
问题是,有时最终用户对前端不耐烦,我们最终会为另一个表中的特定记录发布多个过期事务。
有问题的表格如下:
+---------------+-----------------------------+------+-----+-------------------+-------+
| 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年了,而且我非常生疏。任何帮助将不胜感激!!
答案 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)