【问题标题】:How to fetch all rows with left join getting the latest row in second table如何使用左连接获取所有行获取第二个表中的最新行
【发布时间】:2013-03-06 14:08:59
【问题描述】:

我正在尝试按照说明 in this answer 如何获取连接表中的最新行。

我有两张桌子。

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 进行什么更改才能获得所有项目的最新状态。

【问题讨论】:

    标签: mysql join


    【解决方案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;
    

    【讨论】:

    • 谢谢蓝脚。但是a) 这会返回一个项目 ID 的所有状态。我只寻找最新的状态。 b)我怎样才能得到所有的项目
    • 第二个查询效果很好。只是在子选择中缺少逗号,谢谢。现在,如何获取所有项目,而不仅仅是通过 id?
    • @InGodITrust 您可以从子查询中删除WHERE project_id = 2,它将返回所有项目的记录。
    • 只在项目表中存储状态行的主 ID 并使用简单的连接而不是这种复杂的业务会更干净吗?
    • @InGodITrust 这取决于,状态会在不同的日期发生变化。您不想知道状态何时更改吗?如果是这样,那么您仍然需要存储在单独的表中。
    猜你喜欢
    • 2021-03-30
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    相关资源
    最近更新 更多