mysql查询从日志中获取项目详细信息和last max()操作详细信息

20jt8wwn  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(405)

如何编写mysql查询以获取项目详细信息和整个活动日志的最后一行?我想要一个所有项目的列表,与数据从每个项目的最新一行从行动日志,所有它的顺序由最近的行动日志日期描述。对不起,我知道这是一个常见的查询和答案必须非常容易。但我找不到解决办法。我搜索了所有可能的单词组合。我发现一些示例只需要一个字段,比如joined表中的max(id)。我找到了凝聚的解决方案,但似乎不能使它们起作用。我的问题是,我需要来自'parent'表行pl\u projects的许多字段以及来自联接表pl\u log行的许多字段,更不用说来自两次联接的同一个表的人名了。
我尝试的每种方法都会给出pl\u日志的所有行,重复pl\u项目中的行。或者,如果我在子查询中设置了限制,我只从plu日志中得到一个项目的一行。以下是我的查询不起作用:

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
tct7dpnv

tct7dpnv1#

我认为您的问题是,当您使用max()时,您的子选择只生成一行,而每个项目需要一行(我认为是lg\u pj\u id)。
只需重写subselect就可以为每个项目生成一行,其中包含来自最近活动的信息。您的操作日志中是否有活动id?因为它看起来像lg\u pj\u id是项目的\u id。lg\u desc的含义也是未知的(或者是动作的\u log\u id?)。在子选择中尝试按项目id分组,并根据需要从相应行中选择最大值或选择每个组具有最大值的行(项目id)
感谢小组的建议,让每个项目一行。我尝试更改子查询,如下所示:

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

现在,我从日志中得到一行,但是它给了我max id,但不是同一行的lg\u 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仅获取该行时,它会给出max lg\u id,但会给出第一个lg\u desc。我需要来自max(lg\u 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

相关问题