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

aiazj4mn  于 2024-01-05  发布在  Mysql
关注(0)|答案(1)|浏览(181)

此问题在此处已有答案

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

  1. SELECT user_id,
  2. max(login_time) as last_login_time,
  3. task_name as last_task_worked_on
  4. FROM user_tasks
  5. WHERE user_id IN (123, 456, 789) group by user_id;

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

  1. create table user_tasks (
  2. user_id int(11),
  3. login_time datetime,
  4. task_name varchar(50) )
  5. insert into user_tasks values (123, '2023-01-30 06:10:03', 'walk dog');
  6. insert into user_tasks values (123, '2023-02-30 06:10:03', 'bathe dog');
  7. insert into user_tasks values (123, '2023-05-30 06:10:03', 'feed dog');
  8. insert into user_tasks values (456, '2023-03-30 06:10:03', 'feed dog');
  9. insert into user_tasks values (456, '2023-02-30 06:10:03', 'walk dog');
  10. insert into user_tasks values (456, '2023-01-30 06:10:03', 'bathe dog');
  11. insert into user_tasks values (789, '2023-03-30 06:10:03', 'feed dog');
  12. insert into user_tasks values (789, '2023-01-30 06:10:03', 'walk dog');
  13. insert into user_tasks values (789, '2023-05-30 06:10:03', 'bathe dog');
  14. insert into user_tasks values (898, '2023-05-30 06:10:03', 'walk dog');
  15. insert into user_tasks values (900, '2023-05-30 06:10:03', 'bathe dog');


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

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


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

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

0tdrvxhp

0tdrvxhp1#

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

  1. SELECT user_id, max(login_time) as last_login_time
  2. FROM user_tasks
  3. WHERE user_id IN (123, 456, 789)
  4. GROUP BY user_id

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

  1. SELECT u.*
  2. FROM user_tasks u
  3. INNER JOIN (
  4. SELECT user_id, max(login_time) as last_login_time
  5. FROM user_tasks
  6. WHERE user_id IN (123, 456, 789)
  7. group by user_id
  8. ) AS s ON s.user_id = u.user_id and s.last_login_time = u.login_time;


结果如下:

  1. user_id login_time task_name
  2. 123 2023-05-30 06:10:03 feed dog
  3. 456 2023-03-30 06:10:03 feed dog
  4. 789 2023-05-30 06:10:03 bathe dog

展开查看全部

相关问题