根据活动日期显示mysql表上的特定字段

时间:2012-08-31 03:25:06

标签: mysql sql

假设我有3个表:

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

怎么做?感谢。

1 个答案:

答案 0 :(得分: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小提琴)。