在 MySQL 中为版本化数据指定 MAX 组函数

Specifying MAX group function in MySQL for versioned data

我有以下 MySQL table:

[orders]
===
order_id BIGINT UNSIGNED AUTO INCREMENT (primary key)
order_ref_id VARCHAR(36) NOT NULL,
order_version BIGINT NOT NULL,
order_name VARCHAR(100) NOT NULL
...
lots of other fields

订单是“版本化”的,这意味着多个订单可以具有相同的 order_ref_id 但会有不同的版本(版本 0、版本 1、版本 2 等)。

我想编写一个查询,该查询 return 根据其 order_ref_idMAX 版本的订单的所有订单字段,所以像这样:

SELECT
  *
FROM
  orders
WHERE
  order_ref_id = '12345'
  AND
  MAX(order_version)

换句话说:给定 org_ref_id,给我具有最高版本号的单个 orders 记录。因此,如果 table 中存在以下行:

order_id  | order_ref_id  |. order_version | order_name
======================================================================
1         |  12345        | 0              | "Hello"
2         |  12345        | 1              | "Goodbye"
3         |  12345        | 2              | "Wazzup"

我想要一个查询 return:

3         |  12345        | 2              | "Wazzup"

但是上面的查询是无效的,结果是:

ERROR 1111 (HY000): Invalid use of group function

知道典型的MAX()例子会让我写一些像:

SELECT
  MAX(order_version)
FROM
  orders
WHERE
  order_ref_id = '12345';

但这只是给了我 order_version,而不是所有 (*) 字段。 谁能帮我推一下这里的终点线?

您可以尝试使用最大版本组的子查询 order_ref_id

    select * from  orders  o 
    inner join (
        SELECT order_ref_id
           , MAX(order_version) max_ver
        FROM   orders
        group by  order_ref_id
    ) t on t.order_ref_id = o.order_ref_id 
            and t.max_ver = o.order_version