如何基于在SQL

时间:2015-11-06 03:59:02

标签: mysql sql join left-join

我有2个表:1个包含任务,1个包含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_percentage)

我想要的表格如下:

task_mgr.id | task_mgr.name | task_actions.completion_percentage

(这是此task_mgr.id或task_actions.task_id的最后一条记录)

关于如何获得这个的任何想法?

干杯!

3 个答案:

答案 0 :(得分:1)

要解决这个问题,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

答案 1 :(得分:0)

您是否尝试过完全结合您的查询? LEFT将您的最大日期列表加入到wp_task_mgr,然后在最大日期列表上左键加入以将详细信息分组到仅与最大日期查询结果匹配的那些?

例如:

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

在移动设备上进行格式化道歉。

答案 2 :(得分:0)

虽然获取最大日期可能是一个子查询,并且将该组限制为特定的“id_task”将提高性能


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
where
    wp_task_actions.created_taskaction in (
    SELECT MAX(created_taskaction) AS MaxDateTime
    FROM wp_task_actions wta
    where wta.id_task = wp_task_actions.id_task
    GROUP BY id_task)