我有 user_status 表,它由不同的用户及其状态(A,B,C,D)组成,现在我的要求是状态 A 应该与所有其他状态(B,C,D)进行比较并仅获取状态 A 值的记录如果状态 A 的更新时间大于所有其他状态,但状态 A 在 (B,C,D) 之前处理,因此与其他状态相比更新时间较少,那么在这种情况下不会获得任何记录
id user_id status updated
1 1 C 2023-12-28 23:32:06
2 1 B 2023-12-28 23:34:06
3 1 A 2023-12-28 23:36:06
4 2 B 2023-12-27 23:12:02
5 2 D 2023-12-27 23:15:08
6 2 A 2023-12-27 23:18:06
7 2 C 2023-12-27 23:22:06
预期输出: 编号=3 对于 user-1 记录应该 get=> 对于该用户,最近状态是 A,并且 B、C、D 在 A 之前处理,因此优先级给予状态 A
对于用户 2,不应获取任何记录,因为状态 A 必须最后处理,但它已经被处理,因此该用户的最后状态是 C
Mysql query :
SELECT t1.*
FROM table t1
INNER JOIN table t2 on t2.status=t1.status where t1.status='A' and t1.updated > t2.updated
根据我对您问题的阅读,似乎对于每个
user_id
值,您想要将具有 updated
= 'A' 的行的 status
值与具有 updated
的行的
status
值进行比较<>
A
,如果 A
值大于其他行的 updated
值,则选择 updated
行。如果是这样,那么以下应该有效。
架构(MySQL v5.7)
CREATE TABLE user_status (
id INT NOT NULL PRIMARY KEY,
user_id INT NOT NULL,
status CHAR(1) NOT NULL,
updated DATETIME NOT NULL
);
INSERT INTO user_status VALUES
(1, 1, 'C', '2023-12-28 23:32:06'),
(2, 1, 'B', '2023-12-28 23:34:06'),
(3, 1, 'A', '2023-12-28 23:36:06'),
(4, 2, 'B', '2023-12-27 23:12:02'),
(5, 2, 'D', '2023-12-27 23:15:08'),
(6, 2, 'A', '2023-12-27 23:18:06'),
(7, 2, 'C', '2023-12-27 23:22:06')
;
查询#1
SELECT u.* FROM user_status u JOIN (
SELECT user_id, MAX(updated) AS max_updated FROM user_status
WHERE status <> 'A'
GROUP BY user_id
) sq ON u.user_id = sq.user_id AND u.status = 'A' AND u.updated > sq.max_updated
;
id | 用户ID | 状态 | 更新了 |
---|---|---|---|
3 | 1 | A | 2023-12-28 23:36:06 |
注意
连接条件
... AND USER = 'A' ...
并不是真正必要的,因为给定 u.updated > sq.max_updated
,那么 USER
列值必须是“A”。所以我们真的只需要:
SELECT u.* FROM user_status u JOIN (
SELECT user_id, MAX(updated) AS max_updated FROM user_status
WHERE status <> 'A'
GROUP BY user_id
) sq ON u.user_id = sq.user_id AND u.updated > sq.max_updated
;
但是,如果我们将条件
u.updated > sq.max_updated
更改为 u.updated >= sq.max_updated
,那么我们就必须添加额外的测试 u.status = 'A'
,因为总会有至少一个非“A”行对应 u.updated >= sq.max_updated
。