MYSQL查询从日志中获取项目详细信息和最后的MAX()操作详细信息

时间:2018-06-14 13:00:49

标签: mysql subquery max

如何编写MYSQL查询以获取项目详细信息以及活动日志的整个最后一行?我想要一个所有项目的列表,每个项目的最新行数据来自操作日志,所有项目都按最近的操作日志日期DESC排序。对不起,我知道这是一个常见的查询,答案必须非常简单。但我找不到解决方案。我搜索了每个可能的单词组合。我发现只需要一个字段的示例,例如连接表中的MAX(id)。我找到了COALESCE的解决方案,但似乎无法使它们起作用。我的问题是我需要来自'父'表行PL_PROJECTS的许多字段以及连接表PL_LOG行中的许多字段,更不用说连接两次的同一个表中的人名。

我尝试的所有内容都会为我提供PL_LOG的所有行,重复PL_PROJECTS中的行。或者,如果我在子查询中放置LIMIT,我只从一个项目的PL_LOG中获取一行。这是我的查询不起作用:

SELECT 
PJ.pj_id, PJ.pj_title, PJ.pj_location, PJ.pj_desc, PJ.pj_request, PJ.pj_date_start, PP1.pp_name AS supervisor_name, PP2.pp_name AS customer_name, ST.st_desc, logDate, logDesc

FROM PL_PROJECTS PJ 

INNER JOIN PL_PEOPLE PP1 ON PJ.pj_spst_member = PP1.pp_id 

INNER JOIN PL_PEOPLE PP2 ON PJ.pj_pp_id = PP2.pp_id 

INNER JOIN PL_STATUS ST ON PJ.pj_status = ST.st_id 

LEFT OUTER JOIN ( 

    SELECT MAX(lg_pj_id) MaxLogID, lg_date AS logDate, lg_desc AS logDesc, lg_pj_id
    FROM PL_LOG PL
    ORDER BY lg_id DESC

) 

LR ON LR.lg_pj_id = PJ.pj_id 

GROUP BY PJ.pj_id
ORDER BY logDate DESC

LIMIT 9999999

1 个答案:

答案 0 :(得分:0)

我认为你的问题是,你的子选择只产生一行,因为你使用max()而你需要每个项目一行(我认为是lg_pj_id)。

您只需重写子选择,即可为每个项目生成一行,其中包含最近活动的信息。您的操作日志中是否有activity_ID?因为它看起来像 lg_pj_id是project_ID。 lg_desc的含义也是未知的(或者是action_log_id?)。尝试按子选择中的project_ID进行分组,并根据需要从相应行中选择最大值,或选择每组具有最大值的行(project_ID)

感谢GROUP BY建议每个项目获得一行。我尝试更改子查询,如下所示:

SELECT MAX(lg_id) AS MaxLogID, lg_desc, lg_pj_id
    FROM PL_LOG PL
    GROUP BY lg_pj_id

现在,我从日志中得到一行,但是它给了我最大的id,但不是同一行的lg_desc!如果我自己尝试子查询:

SELECT lg_id, lg_pj_id, lg_date, lg_desc 
    FROM `PL_LOG` 
    WHERE lg_pj_id = 33 
    ORDER BY lg_date DESC

我得到这些行。你可以看到最大行,68有一个描述“30分钟skype呼叫。”

68,33,2018-06-10 00:00:00","30 minute skype call."

61,33,"2018-06-02 00:00:00","Sent email to try to elicit a response."

52,33,"2018-05-10 00:00:00","sent follow up email"

47,33,"2018-03-26 00:00:00","sent initial email"

46,33,"2018-03-26 00:00:00","sent initial email"

但是当我尝试使用GROUP BY获取该行时,它会给我最大的lg_id,但是第一个lg_desc。我需要来自max(lg_id)行的所有数据:

SELECT MAX(lg_id) AS MaxLogID, lg_pj_id, lg_date, lg_desc
    FROM PL_LOG
    WHERE lg_pj_id = 33
    GROUP BY lg_pj_id
    ORDER BY MaxLogID DESC

返回:

68, 33, "2018-03-26 00:00:00", "sent initial email"

请在我的评论中提及:

SELECT 
PJ.pj_id, PJ.pj_title, PJ.pj_location, PJ.pj_desc, PJ.pj_request,    
PJ.pj_date_start, PP1.pp_name AS supervisor_name, PP2.pp_name AS 
customer_name, ST.st_desc, logDate, logDesc

FROM PL_PROJECTS PJ 

INNER JOIN PL_PEOPLE PP1 ON PJ.pj_spst_member = PP1.pp_id 

INNER JOIN PL_PEOPLE PP2 ON PJ.pj_pp_id = PP2.pp_id 

INNER JOIN PL_STATUS ST ON PJ.pj_status = ST.st_id 

LEFT JOIN (SELECT lg_id, lg_date AS logDate, lg_desc AS logDesc, lg_pj_id  
           FROM PL_LOG AS PL 
           WHERE PL.lg_id=(SELECT MAX(lg_id) FROM PL_LOG AS PL_2
                           WHERE PL_LOG.lg_pj_id  = PL_2.lg_pj_id )
LR ON LR.lg_pj_id = PJ.pj_id

GROUP BY PJ.pj_id
ORDER BY logDate DESC

LIMIT 9999999