Mysql查询根据时间优先级获取用户的特定状态记录(如果特定状态是最近/最近处理的)

问题描述 投票:0回答:1

我有 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 
mysql inner-join
1个回答
0
投票

根据我对您问题的阅读,似乎对于每个

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

在 DB Fiddle 上查看

注意

连接条件

... 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

© www.soinside.com 2019 - 2024. All rights reserved.