2012-08-31 22 views
0

假設我有3個表:顯示基於活動的日期在MySQL表中的特定字段

A) Table UsrHeader 
    ----------------- 
    UsrID | UsrName 
    ----------------- 
    1  | Abc 
    2  | Bcd 

B) Table UsrDetail 
    ------------------------------- 
    UsrID | UsrLoc | Date 
    ------------------------------- 
    1  | LocA | 10 Aug 2012 
    1  | LocB | 15 Aug 2012 
    2  | LocA | 10 Aug 2012 

C) Table Trx 
    ----------------------------- 
    TrxID | TrxDate  | UsrID 
    ----------------------------- 
    1  | 10 Aug 2012 | 1 
    2  | 16 Aug 2012 | 1 
    3  | 11 Aug 2012 | 2 

我想要做的是顯示如表:

--------------------------------------- 
    TrxID | TrxDate  | UsrID | UsrLoc 
    --------------------------------------- 
    1  | 10 Aug 2012 | 1  | LocA 
    2  | 16 Aug 2012 | 1  | LocB 
    3  | 11 Aug 2012 | 2  | LocA 

注意到有是一個用戶,但位置不同。這是基於UsrDetail表,指定日期的用戶已移至其他位置。因此,它應該在每個交易上顯示該日期的用戶特定位置。

我曾嘗試這個代碼,但沒有運氣:

SELECT trx.TrxID, trx.TrxDate, trx.UsrID, User.UsrName, User.UsrLoc 
FROM trx 
INNER JOIN 
(SELECT UsrHeader.UsrID, UsrHeader.UsrName, UserDetail.UsrLoc 
    FROM UsrHeader 
    INNER JOIN 
    (SELECT UsrDetail.UsrID, UsrDetail.UsrLoc, UsrDetail.Date 
    FROM UsrDetail 
) AS UserDetail ON UserDetail.UsrID = UsrHeader.UsrID 
) AS User ON User.UsrID = trx.UsrID 
      AND trx.TrxDate >= User.Date 

如何做到這一點?謝謝。

回答

4

使用以下命令:

SELECT trx.TrxID, trx.TrxDate, uh.UsrName, ud.UsrLoc 
FROM trx 
    INNER JOIN UsrDetail ud ON (trx.UsrId = ud.UsrId) 
    INNER JOIN UsrHeader uh ON (trx.UsrId = uh.UsrId) 
WHERE ud.Date = (SELECT MAX(t.Date) 
       FROM UsrDetail t 
       WHERE t.UsrId = trx.UsrId 
        AND t.Date <= trx.TrxDate) 

這裏有一個DEMO(SQL小提琴)。

+0

嗨,謝謝!它很棒! :) –

相關問題