如何根据 SQL 中使用复杂语句的 WHERE 连接两个表

How to JOIN two tables based on a WHERE that uses a complex statement in SQL

我有 2 个 table:1 个有任务,1 个有 task_actions。

我想让任务 table 包含一些关于 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 并在 table:

中获取最近的操作
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");

现在我需要合并这两个查询。我需要我的完整任务 table,其中一列来自显示该 task_id 的最近操作的操作。 (即task_actions.completion_percentage)

我想要的 table 看起来像:

task_mgr.id | task_mgr.name | task_actions.completion_percentage

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

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

干杯!

您是否尝试过真正地组合您的查询?将您的最大日期列表左联接到 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

抱歉在移动设备上格式化。

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

虽然获取最大日期可能是一个子查询,但将分组依据限制为特定 '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)