2011-11-08 2 views
0

데이터베이스의 레코드와 관련하여 트랜잭션에 대해 보관하는 테이블에 대해 쿼리를 실행하려고합니다. 좀 더 구체적으로 말하면 우리가 "자산"을 "만료"할 때 주 테이블에서 상태가 만료되도록 변경하고 만료시기에 대한 기록을 기록합니다 (이것은 내 디자인이 아니 었습니다).트랜잭션 테이블에서 가장 최근의 레코드 얻기

문제는 최종 사용자가 프런트 엔드에 조급해하지 못하고 다른 테이블의 특정 레코드에 대해 만료 된 트랜잭션이 여러 번 끝나는 경우입니다. 다음과 같이

문제의 테이블입니다 : 내가 확인 m_id, a_ordinal 및 복합 키를 형성 date_expired 수있는에서

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

AWESOME! 고마워, 며칠 동안 고생하고 있었고, 나는 매우 좌절하게되었다. 돌아가서 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)