0

我正在尝试按照此答案中的说明如何获取连接表中的最新行。

我有两张桌子。

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

当我知道项目 ID(示例 = 2)时,我有正确的查询来选择最新的状态更新。

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

但是,我无法弄清楚如何选择所有具有当前状态的项目。我必须对 sql 进行什么更改才能获得所有项目的最新状态。

4

1 回答 1

1

我建议更改您的查询以使用聚合函数来获取具有状态的最新日期:

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

这将获取max(created)每个项目的日期,然后此结果用于返回该日期的状态。

这也可以写成:

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;
于 2013-03-06T14:15:24.797 回答