我有两个表:一个包含tasks,一个包含task_actions。
我想要一个任务表,其中包含一些关于task_actions列的信息。当我使用这样的LEFT JOIN时,效果很好:
SELECT
*, wp_task_mgr.id AS task_id,
wp_task_actions.id AS action_id,
wp_task_actions.completion_percentage AS lastcompperc
FROM
wp_task_mgr
LEFT JOIN wp_task_actions
ON wp_task_mgr.id = wp_task_actions.id_task
然而,问题是:通过这个查询,我得到的是对任务最早的操作,而不是最近的操作。
很长一段时间以来,我一直在寻找将最新记录分组在某一列上的方法,我能够获得最新记录。
我能够获得按task_id分组的最新操作。因此,搜索1 task_id并在表中获得最新的操作:
SELECT *
FROM wp_task_actions
INNER JOIN
(SELECT id_task, MAX(created_taskaction) AS MaxDateTime
FROM wp_task_actions
GROUP BY id_task) mostrecent ON wp_task_actions.id_task = mostrecent.id_task
AND wp_task_actions.created_taskaction = mostrecent.MaxDateTime");
现在我需要将这两个查询结合起来。我需要我的完整任务表,其中有一列来自操作,显示该task_id的最新操作。(即task_actions.completion_percent)
我想要的表格看起来像:
task_mgr.id | task_mgr.name | task_actions.completion_percentage
(这是指向此task_mgr.id或task_actions.task_id的最后一条记录)
有什么想法吗?
干杯!
为了解决这个问题,MS SQL 2005+使用OUTER APPLY,但我不确定MySQL是否可以使用它:
SELECT
wp_task_mgr.*,
wp_task_mgr.id AS task_id,
A.id AS action_id,
A.lastcompperc
FROM
wp_task_mgr
OUTER APPLY (
SELECT DISTINCT id, id_task,
(SELECT MAX(created_taskaction) AS lastcompperc
FROM wp_task_actions WHERE id_task = wp.id_task)
FROM wp_task_actions wp
WHERE wp_task_mgr.id = wp_task_actions.id_task
) AS A
但是,您可以使用LEFT JOIN:
SELECT
wp_task_mgr.*,
wp_task_mgr.id AS task_id,
A.id AS action_id,
A.lastcompperc
FROM
wp_task_mgr
LEFT JOIN (
SELECT DISTINCT id, id_task,
(SELECT MAX(created_taskaction) AS lastcompperc
FROM wp_task_actions WHERE id_task = wp.id_task)
FROM wp_task_actions wp
) AS A
ON wp_task_mgr.id = A.id_task
您是否尝试过完全组合查询?LEFT JOIN您的"最长日期"列表到wp_task_mgr,然后LEFT JOIN-Max-Date列表将详细信息子集设置为仅与"最长时间"查询结果匹配?
例如:
SELECT
wp_task_mgr.id AS task_id,
wp_task_actions.id AS action_id,
wp_task_actions.completion_percentage AS lastcompperc
FROM
wp_task_mgr
LEFT JOIN
(SELECT id_task, MAX(created_taskaction) AS MaxDateTime
FROM wp_task_actions
GROUP BY id_task) mostrecent
ON wp_task_mgr.id = mostrecent.id_task
LEFT JOIN wp_task_actions
ON mostrecent.id_task = wp_task_actions.id_task
AND wp_task_actions.created_taskaction = mostrecent.MaxDateTime
抱歉格式化,在手机上。
虽然获取最大日期可能是一个子查询,并将组限制为特定的"id_task"将提高的性能
选择*,wp_task_mgr.id AS task_id,task_ actions.id AS action_id,wp_task_actions.complete_opercentage AS lastcompperc来自wp_task_mgr左联接wp_task_actions打开wp_task_mgr.id=wp_task_actions.id_task哪里wp_task_actions.created_taskaction(SELECT MAX(created_taskaction)AS MaxDateTimeFROM wp_task_actions wta其中wta.id_task=wp_task_actions.id_task按id_task分组)