mysql - 在 GROUP BY 中选择 MAX,但在 MYSQL 中将结果限制为 1

标签 mysql sql dbeaver

我有下表:

Task (id,....)

TaskPlan (id, task_id,.......,end_at)

请注意,end_at 是一个时间戳,一个任务有多个任务计划。我需要查询每个任务的 MAX end_at

此查询工作正常,除非不同任务计划具有相同的精确时间戳。在这种情况下,我将返回多个任务计划,其中同一任务的 MAX end_at

我知道这种情况不太可能发生,但我是否可以将每个 task_id 的结果数量限制为 1?

我当前的代码是:

SELECT * FROM Task AS t
INNER JOIN (
SELECT * FROM TaskPlan WHERE end_at in (SELECT MAX(end_at) FROM TaskPlan GROUP BY task_id )
) AS pt 
ON pt.task_id = t.id
WHERE status = 'plan';

这是可行的,除了上述情况之外,如何实现呢? 同样在子查询中,是否可以执行类似的操作,以便我可以将 TaskPlan.id 用于 where in 条款?

SELECT id, MAX(end_at) FROM TaskPlan GROUP BY task_id

当我尝试时,出现以下错误:

SQL Error [1055] [42000]: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'TaskPlan.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

非常欢迎任何解释和建议!

重复标签注意事项: (现已重新打开)

我已经研究了 this question ,但它没有为我的情况提供答案,即结果中有多个最大值,并且需要将其过滤掉以每组仅包含一个结果行。

最佳答案

使用id而不是时间戳:

SELECT *
FROM Task AS t INNER JOIN
     (SELECT tp.*
      FROM TaskPlan tp
      WHERE tp.id = (SELECT tp2.id FROM TaskPlan tp2 WHERE tp2.task_id = tp.task_id ORDER BY tp2.end_at DESC LIMIT 1)
     ) tp 
     ON tp.task_id = t.id
WHERE status = 'plan';

或者将 in 与元组一起使用:

SELECT *
FROM Task AS t INNER JOIN
     (SELECT tp.*
      FROM TaskPlan tp
      WHERE (tp.task_id, tp.end_at) in (SELECT tp2.task_id, MAX(tp2.end_at)
                                        FROM TaskPlan tp2 
                                        GROUP BY tp2.task_id
                                       )
     ) tp 
     ON tp.task_id = t.id
WHERE status = 'plan';

关于mysql - 在 GROUP BY 中选择 MAX,但在 MYSQL 中将结果限制为 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50592341/

相关文章:

java - 找不到合适的驱动程序错误

php - 如何获取 Zend_DB_table 受影响的行?

java - 连接到数据库时 DataGrip 和 DBeaver(基于 Java 的数据库 IDE)出错

mysql - 如何确定从 MySQL 导入的日期?

当字段有空格时 MySQL 准备好的语句不起作用

Java SQL查询准备语句动态参数

DBeaver 在导入/导出时不保留主键

command-line-interface - DBeaver:如何使用命令行生成ER图?

mysql - 我如何为大量关键字表制作摘要标签,例如a-z 不够,需要 ab - ac 等?

mysql - MySQL中如何每3个月自动截断一次表?