我正在try 使用max(..)从集合中获取最大值,但我还希望获得与此行对应的其他行值(如果有多行匹配相同的"max",则为行).我使用的是MySQL8.

我使用这个SQL(SelVazi在相关帖子中提供的解决方案:Get value from the same row as an aggregate function (max) in MySQL using SELECT query)完成了部分工作.

然而,现在事情变得更加复杂了.我将任务拆分到一个单独的表中,这样我只需要将任务ID值保存在"USER_TASKS"表中.

在有多个任务具有相同的"max"日期时间的情况下,我希望在结果集中列出所有这些任务名称(带有TASK_DATION值)

这是我目前使用的SQL:

SELECT u.*
FROM user_tasks u
INNER JOIN (
  SELECT user_id, max(login_time) as last_login_time, task_duration 
  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;

以下是数据库架构的一些示例值(&A):

create table user_tasks (
    user_id int(11), 
    login_time datetime, 
    task_id int(11), 
    task_duration int(11)
)

create table tasks (
    task_id int(11),
    task_name varchar(50)
)

insert into user_tasks values (123, '2023-01-30 06:10:03', 1, 50);
insert into user_tasks values (123, '2023-02-25 06:10:03', 2, 45);

# please note below there are duplicate date values (so both are "max")

insert into user_tasks values (123, '2023-05-30 06:10:03', 3, 60);
insert into user_tasks values (123, '2023-05-30 06:10:03', 2, 20);

insert into user_tasks values (456, '2023-03-30 06:10:03', 3, 50);
insert into user_tasks values (456, '2023-02-25 06:10:03', 1, 20);
insert into user_tasks values (456, '2023-01-30 06:10:03', 2, 10);

insert into user_tasks values (789, '2023-03-30 06:10:03', 3, 35);
insert into user_tasks values (789, '2023-01-30 06:10:03', 1, 38);
insert into user_tasks values (789, '2023-05-30 06:10:03', 2, 26);

insert into user_tasks values (898, '2023-05-30 06:10:03', 1, 16);
insert into user_tasks values (900, '2023-05-30 06:10:03', 2, 18);

# and now, the tasks table...

insert into tasks values (1, 'walk dog');
insert into tasks values (2, 'bathe dog');
insert into tasks values (3, 'feed dog');

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

123,'2023-05-30 06:10:03', 3, 60
123,'2023-05-30 06:10:03', 2, 20
456,'2023-03-30 06:10:03', 3, 50
789,'2023-05-30 06:10:03', 2, 26

然而,我希望它能产生这样的结果:

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

此外,如果有人能为这篇文章想出一个更好的标题,请推荐一个,我很乐意编辑它,以更好地反映这个问题.谢谢!

推荐答案

只要加入额外的桌子...

SELECT
    u.user_id,
    u.login_time,
    tasks.task_name,
    u.task_duration 
FROM
  user_tasks u
INNER JOIN
(
  SELECT
    user_id, max(login_time) as last_login_time, task_duration 
  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
----------------------------------------
-- Added this
----------------------------------------
INNER JOIN 
  tasks 
    ON tasks.task_id = u.task_id;

或者更准确地说...

WITH
  ranked_user_task AS
(
  SELECT
    *,
    DENSE_RANK() OVER (
      PARTITION BY user_id
          ORDER BY login_time DESC
    ) 
      AS user_task_rank
  FROM
    user_tasks
)
SELECT
    u.user_id,
    u.login_time,
    t.task_name,
    u.task_duration 
FROM
  ranked_user_task   AS u
INNER JOIN 
  tasks              AS t
    ON t.task_id = u.task_id
WHERE
      u.user_id IN (123, 456, 789)  
  AND u.user_task_rank = 1
;

Mysql相关问答推荐

如何有效地计算共同的朋友/追随者?

MySQL问题难以将文本字符串转换为正确的日期格式

SQL/Pyspark -判断条件

我是否需要在 N+1 列上建立索引,才能有效地在 N 列上执行 SELECT,并按其他列排序?

从单行中获取最大日期的最佳方法

如何创建一个列,该列在另一个表中具有值的计数?

是否可以使用以EXPLAIN EXTENDED ...开头的 SQL 语句修改数据?

计算MySQL中的连续出现

如何优化使用多个 LEFT JOIN 和 GROUP BY 子句的慢速 MySQL 查询?

MySql部分匹配基于部分查询代码

查询获取日期之间的可数匹配条目并加入它们以读取用户状态

有没有更好的方法在无限滚动的网页上呈现获取的提要数据?

Mysql 相等性反对 false 或 true

此插页中的X是什么> X'3C2F756C3E'

最好的 MySQL 性能调优工具?

用序列号mysql更新列

计算执行的查询数

在 Mac 上设置 Laravel php artisan migrate 错误:没有这样的文件或目录

什么是全文索引,我应该什么时候使用它?

使用 MySql,我可以对列进行排序但最后有 0 吗?