问题
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