首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何基于在SQL中使用复杂语句的WHERE连接两个表

问如何基于在SQL中使用复杂语句的WHERE连接两个表
EN

Stack Overflow用户
提问于 2015-11-06 03:59:02
回答 2查看 55关注 0票数 0

我有两个表:一个有任务,一个有task_actions。

我想要有关于task_actions列的一些信息的任务表。当我像这样使用左联接时,这样做很好:

代码语言:javascript
复制
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并获取表中的最新操作:

代码语言:javascript
复制
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");

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

我想要的桌子看起来像:

代码语言:javascript
复制
task_mgr.id | task_mgr.name | task_actions.completion_percentage

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

有什么办法能弄到这个吗?

干杯!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-06 04:24:09

为了解决这个问题,MS SQL 2005+使用外部应用程序,但我不确定MySQL是否可以使用它:

代码语言:javascript
复制
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

但是,您可以使用左联接:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-11-06 04:17:53

您是否真的尝试过合并您的查询?左加入您的最大日期列表到wp_task_mgr,然后在最大日期列表上左加入子集的细节,只有那些匹配的最大日期查询结果?

例:

代码语言:javascript
复制
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

在移动平台上为格式设置表示歉意。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33559266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档