2011-11-08 41 views
0

我試圖對我們保留的有關我們數據庫記錄方面的事務處理的表執行查詢。更具體地說,當我們將一個「資產」「過期」時(我們稱之爲),我們將其狀態更改爲主表中的過期狀態,然後記錄它在另一個狀態中過期的記錄(這不是我的設計)。獲取交易表中最近的記錄

問題是,有時候最終用戶會對前端感到不耐煩,而我們最終會從另一個表中獲得特定記錄的多個過期事務。

有問題的表如下:

+---------------+-----------------------------+------+-----+-------------------+-------+ 
| 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合作以來,我很生疏。任何幫助,將不勝感激!!

回答

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組合),您需要做更復雜的事情。

+0

真棒!非常感謝,我爲此奮鬥了幾天,而且我變得非常沮喪。我需要回顧並更清楚地查看我的JOIN類型。 我曾經能夠把這些東西拿出來,就像大學裏沒有人在DB課上做生意一樣,但是我從未觸及它,並且失去了一切。我感覺不足!再次感謝。 – mattai

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)