代码之家  ›  专栏  ›  技术社区  ›  michael

在mysql表中的最高值上连接时出现问题

  •  3
  • michael  · 技术社区  · 18 年前

    我有一个产品表…

    alt text http://img357.imageshack.us/img357/6393/productscx5.gif

    以及修订表,用于跟踪产品信息的更改。

    alt text http://img124.imageshack.us/img124/1139/revisionslz5.gif

    我试图查询所有产品的数据库,以及它们的最新版本…

    select
    *
    from `products` as `p`
    left join `revisions` as `r` on `r`.`product_id` = `p`.`product_id`
    group by `p`.`product_id`
    order by `r`.`modified` desc
    

    但我总是得到第一次修订。我需要在 一 选择(即无子查询)。我可以在mssql中管理它,这在mysql中是可能的吗?

    3 回复  |  直到 13 年前
        1
  •  4
  •   Bill Karwin    18 年前

    我会这样做:

    SELECT p.*, r.*
    FROM products AS p
      JOIN revisions AS r USING (product_id)
      LEFT OUTER JOIN revisions AS r2 
        ON (r.product_id = r2.product_id AND r.modified < r2.modified)
    WHERE r2.revision_id IS NULL;
    

    换言之:查找不存在具有相同产品ID和更大修改值的其他修订的修订。

        2
  •  1
  •   ctrlShiftBryan    18 年前

    历史记录表上的开始日期和结束日期将使这成为可能。(在插入新的记录时,将最近的结束日期保留为空并在上一记录上加盖结束日期戳)

    否则,必须使用子查询。

        3
  •  0
  •   J.J.    18 年前

    同样的查询在MySQL中是可解析的。

    为什么使用左联接而不是内部联接或右联接?

    另外,如果你想用另一种方式来处理这个问题,你可以使用max函数。