在MySQL中使用SELECT查询从与聚合函数(max)相同的行获取值[重复]

aiazj4mn  于 5个月前  发布在  Mysql
关注(0)|答案(1)|浏览(87)

此问题在此处已有答案

How to select the first row for each group in MySQL?(16个回答)
Retrieving the last record in each group - MySQL(34个回答)
20天前关闭。
我尝试使用max(..)从集合中获取最大值,但我也想获取与此行对应的其他行值。

SELECT user_id,
    max(login_time) as last_login_time,
    task_name as last_task_worked_on 
        FROM user_tasks
            WHERE user_id IN (123, 456, 789) group by user_id;

字符串
下面是我使用的DB模式和一些示例值:

create table user_tasks (
        user_id int(11), 
        login_time datetime, 
        task_name varchar(50) )

insert into user_tasks values (123, '2023-01-30 06:10:03', 'walk dog');
insert into user_tasks values (123, '2023-02-30 06:10:03', 'bathe dog');
insert into user_tasks values (123, '2023-05-30 06:10:03', 'feed dog');

insert into user_tasks values (456, '2023-03-30 06:10:03', 'feed dog');
insert into user_tasks values (456, '2023-02-30 06:10:03', 'walk dog');
insert into user_tasks values (456, '2023-01-30 06:10:03', 'bathe dog');

insert into user_tasks values (789, '2023-03-30 06:10:03', 'feed dog');
insert into user_tasks values (789, '2023-01-30 06:10:03', 'walk dog');
insert into user_tasks values (789, '2023-05-30 06:10:03', 'bathe dog');

insert into user_tasks values (898, '2023-05-30 06:10:03', 'walk dog');
insert into user_tasks values (900, '2023-05-30 06:10:03', 'bathe dog');


上面的SELECT语句产生以下结果:

'123','2023-05-30 06:10:03','walk dog'
'456','2023-03-30 06:10:03','feed dog'
'789','2023-05-30 06:10:03','feed dog'


但是,第一个值应该是“feed dog”而不是“walk dog”,最后一个值应该是“bathe dog”而不是“feed dog”。
中间的值是正确的,但只是因为“feed dog”恰好对应于第一行,这也是max(login_time)值。
我想要的输出是这样的:

'123','2023-05-30 06:10:03','feed dog'
'456','2023-03-30 06:10:03','feed dog'
'789','2023-05-30 06:10:03','bathe dog'

0tdrvxhp

0tdrvxhp1#

怎么做?
首先获取每user_id的最新 login_time

SELECT user_id, max(login_time) as last_login_time
FROM user_tasks
WHERE user_id IN (123, 456, 789) 
GROUP BY user_id

字符串
然后将此数据集与表连接以获得预期的输出:

SELECT u.*
FROM user_tasks u
INNER JOIN (
  SELECT user_id, max(login_time) as last_login_time
  FROM user_tasks
  WHERE user_id IN (123, 456, 789) 
  group by user_id
) AS s ON s.user_id = u.user_id and s.last_login_time = u.login_time;


结果如下:

user_id login_time          task_name
123     2023-05-30 06:10:03 feed dog
456     2023-03-30 06:10:03 feed dog
789     2023-05-30 06:10:03 bathe dog

相关问题