在 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_id
和 MAX
版本的订单的所有订单字段,所以像这样:
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
我有以下 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_id
和 MAX
版本的订单的所有订单字段,所以像这样:
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