gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:59:15 25 4
gpt4 key购买 nike

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

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

输出将是一种 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

非常感谢您的帮助。

最佳答案

类似这样的事情应该在使用派生表来消除除每个 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

关于mysql - SQL 根据每个连接记录的事务表中的最新条目连接多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23576183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com