SQL根据每个连接记录的事务表中的最新条目连接多个表

时间:2014-05-10 01:19:03

标签: mysql sql join timestamp

我有一个带时间戳的交易表

  • 交易有一个事件和一个用户。
  • 所有交易都有一个事件,
  • 所有事件至少有一次交易,
  • 每个交易都有一个必须存在的用户,
  • 用户不一定要进行交易。

输出将是一种evt列表
输出行数应该等于db.evt记录计数。

每个表的第一列是Autoinc唯一索引 在事务中,这些是其他表的fks。

问题是我需要事务表中的evt的最新时间戳事务。

我仍然相对较新的SQL(使用MySQL),而我混淆了连接。我不知道如何通过时间戳获得evID的最新记录。

我已经查看了有关该主题的其他问题,但未找到解决该问题的问题。 (当然,只有联盟有14K,所以我可能错过了一个)

以下样本表数据: 表格结构很有希望,如果需要,我会编辑它。

编辑: 为了清晰起见,我已经更改了表格和列的名称(以避免匹配关键字)

我在下面尝试了斯图尔特的回答并得到了一个错误:

答案:

SELECT
  eventTable.EvtName AS EvtD,
  transTable.TranAct AS LastTrans,
  userTable.UserName AS UsrNm
FROM
  transTables,
  INNER JOIN (
    SELECT evtID, MAX(TransID) TransID FROM transTable GROUP BY evtID 
  ) last ON last.evtID = transTable.evtID AND last.TransID = transTable.TransID
  INNER JOIN eventTable ON eventTable.evtID = transTable.evtID
  INNER JOIN userTable ON userTable.usId = transTable.usId

响应:

#1064 - You have an error in your SQL syntax; 
    check the manual that corresponds to your MySQL server version for the right syntax to use near
     'INNER JOIN (
        SELECT evtID, MAX(TransID) TransID FROM transTable GROUP BY evt' 
    at line 7 

表:

db.transTable

| TransID | EvtID | TranAct   | timestamp               | UserID
----------------------------------------------------------------
|  1      |  1    |  add      | 2014-05-08 08:10:00.000 | 3
|  2      |  2    |  add      | 2014-05-08 09:10:00.000 | 2
|  3      |  3    |  add      | 2014-05-08 10:10:00.000 | 3
|  4      |  2    |  validate | 2014-05-08 11:10:00.000 | 5
|  5      |  3    |  validate | 2014-05-08 12:10:00.000 | 3
|  6      |  2    |  reverse  | 2014-05-08 13:10:00.000 | 1
|  7      |  1    |  edit     | 2014-05-08 14:10:00.000 | 4
|  8      |  4    |  add      | 2014-05-08 15:10:00.000 | 3
|  9      |  5    |  add      | 2014-05-08 16:10:00.000 | 2


db.eventTable

| EvtID | EvtName 
-----------------
|  1    |  Evt1
|  2    |  Evt2
|  3    |  Evt3
|  4    |  Evt4
|  5    |  Evt5


db.userTable

| UserID | UserName 
--------------------
|  1     |  Usr1      
|  2     |  Usr2      
|  3     |  Usr3      
|  4     |  Usr4      
|  5     |  Usr5      

期望的输出:

eventTable.EvtName AS EvtD
transTable.TranAct AS LastTrans
userTable.UserName AS UsrNm

| EvtD | LastTrans | UsrNm
--------------------------
| Evt1 | edit      | Usr4
| Evt2 | reverse   | Usr1
| Evt3 | validate  | Usr3
| Evt4 | add       | Usr3
| Evt5 | add       | Usr2

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

像这样的shuold工作,使用派生表来消除除最新的每个evId之外的所有事务。

SELECT
  eventTable.EvtName AS EvtD,
  transTable.TranAct AS LastTrans,
  userTable.UserName AS UsrNm,
FROM
  transTable
  INNER JOIN (
    SELECT evId, MAX(UID) uid FROM transTable GROUP BY evId 
  ) last ON last.evId = transTable.evId AND last.uid = transTable.uid
  INNER JOIN eventTable ON eventTable.evId = transTable.evId
  INNER JOIN userTable ON userTable.usId = transTable.usId