How to fetch all rows with left join getting the latest row in second table

て烟熏妆下的殇ゞ 提交于 2020-01-25 10:57:18

问题


I am trying to follow the instructions in this answer how to get the latest row in the joined table.

I have two tables.

Projects : id, title
Status : project_id, status_id, created(DATETIME)

When I know the project ID (example = 2) I have the correct query to select the latest status update.

SELECT projects. * , project_state_project_map.status_id AS status, 
project_state_project_map.created AS status_created
FROM projects
LEFT JOIN (

    SELECT * 
    FROM project_state_project_map
    WHERE project_id = 2
    ORDER BY created DESC 
    LIMIT 1
    )
project_state_project_map ON project_state_project_map.project_id = projects.id
WHERE projects.id = 2
LIMIT 1

However, I cannot figure out how to select all projects with their current status. What do I have to change to the sql to get all projects with their latest states.


回答1:


I would suggest altering your query to use an aggregate function to get the latest date with status:

SELECT p. *, 
  pm1.status_id AS status, 
  pm1.created AS status_created
FROM projects p
LEFT JOIN project_state_project_map pm1
  ON pm1.project_id = p.id
INNER JOIN 
(
  SELECT max(created) MaxDate, project_id
  FROM project_state_project_map
  WHERE project_id = 2
  GROUP BY project_id
) pm2 
  ON pm1.project_id = pm2.project_id
  AND pm1.created = pm2.MaxDate
WHERE p.id = 2

This gets the max(created) date for each project, then this result is used to return the status with that date.

This could also be written as:

SELECT p. *, 
  pm.status_id AS status, 
  pm.created AS status_created
FROM projects p
LEFT JOIN
(
  SELECT pm1.project_id,
    pm1.status_id,
    pm1.created
  FROM project_state_project_map pm1
  INNER JOIN 
  (
    SELECT max(created) MaxDate, project_id
    FROM project_state_project_map
    WHERE project_id = 2
    GROUP BY project_id
  ) pm2
    ON pm1.project_id = pm2.project_id
    AND pm1.created = pm2.MaxDate
) pm
  ON pm.project_id = p.id
WHERE p.id = 2;


来源:https://stackoverflow.com/questions/15249486/how-to-fetch-all-rows-with-left-join-getting-the-latest-row-in-second-table

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!