Mysql sql查询以获取具有特定时间戳的所有用户的事务
我有如下sql表结构:Mysql sql查询以获取具有特定时间戳的所有用户的事务,mysql,Mysql,我有如下sql表结构: id INT(11), amount DOUBLE(10,2), createdAt DATETIME, user_id INT(11), tx_status INT(11). 发送状态的值可以是1(贷方)、2(借方)和3(已结算)。现在我想要的是,当特定用户的tx_status=3时,我想要所有用户的所有最新事务,其中事务createdAt大于最后一个createdAt 数据如下所示: id . amount . createdAt . user_
id INT(11),
amount DOUBLE(10,2),
createdAt DATETIME,
user_id INT(11),
tx_status INT(11).
发送状态的值可以是1(贷方)、2(借方)和3(已结算)。现在我想要的是,当特定用户的tx_status=3时,我想要所有用户的所有最新事务,其中事务createdAt大于最后一个createdAt
数据如下所示:
id . amount . createdAt . user_id . tx_status
112 500 . 2019-05-15 00:30:40 345 . 1
113 . 300 2019-05-16 06:45:29 345 . 2
116 . 600 . 2019-05-16 06:45:33 345 . 3
119 . 567 . 2019-05-17 07:56:55 345 . 1
121 500 . 2019-05-18 00:30:40 346 . 1
123 . 300 2019-05-19 06:45:29 346 . 2
124 . 600 . 2019-05-20 06:45:33 346 . 3
126 . 567 . 2019-05-21 07:56:55 346 . 1
输出应为:
id . amount . createdAt . user_id . tx_status
119 . 567 . 2019-05-17 07:56:55 345 . 1
126 . 567 . 2019-05-21 07:56:55 346 . 1
此查询将为您提供所需的结果。它使用结算发生的最大时间的派生表,使用条件聚合确保如果没有发生结算,该时间为“1970-01-01”(以便返回所有记录)
您想查看上次结算后是否有任何借方或贷方?是的,我想查看每个用户在上次结算后的具体借方和贷方。如果没有状态为3的交易怎么办?然后在示例数据中显示该特定用户的所有交易,您有一些无效时间,但是为什么不包括用户345结算后的两个交易?只有一个交易id为
119
,用户id为345
id113
的交易无效时间大于tx\u status=3
的交易无效时间。也许您可以在示例数据中更正这些时间
SELECT t1.*
FROM transactions t1
JOIN (SELECT user_id, MAX(CASE WHEN tx_status = 3 THEN createdAt ELSE '1970-01-01' END) AS last_settlement
FROM transactions t2
GROUP BY user_id) t2 ON t2.user_id = t1.user_id AND t2.last_settlement < t1.createdAt
id amount createdAt user_id tx_status
119 567 2019-05-17 07:56:55 345 1
126 567 2019-05-21 07:56:55 346 1