我有下表:
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/