如何编写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
答案 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