Mysql 意外的分组行为?
我有一个表Mysql 意外的分组行为?,mysql,mysql-5.6,Mysql,Mysql 5.6,我有一个表引号,数据如下 id number revision status amount ============================================ 1 6681 1 Open 1000.00 2 6681 2 Open 5421.00 3 6681 3 Open 1246.12 4 6681
引号
,数据如下
id number revision status amount
============================================
1 6681 1 Open 1000.00
2 6681 2 Open 5421.00
3 6681 3 Open 1246.12
4 6681 4 Received 8444.12
5 1251 1 Open 412.42
需要注意的重要一点是,每个报价可以有多个修订版本,具有不同的金额和其他信息
我有一个带有SELECT
查询的表,其中一个选项是只查看每个报价的最新版本。我试着用一篇小组文章来完成这一点
通常的查询是
SELECT
number, revision, status, amount
FROM quotes
ORDER BY id DESC
我的分组依据
版本为
SELECT
number, MAX(revision) as `revision`, status, amount
FROM quotes
GROUP BY number
ORDER BY id DESC
我原以为这组人会选择每组数字的最上面的修订版,但取而代之的是它的混合和匹配,我得到了这个
number revision status amount
=======================================
6681 4 Open 1000.00
我得到了正确的编号和版本,但状态显示为Open,金额是第1版的金额,而不是第4版的金额。你知道我的语法有什么问题吗?你可以使用下面的方法,使用一个子查询来获取引号的最新版本。您可以
内部联接
此子查询与您的表,以获取每个组的最新修订的整行(编号
):
您可以使用以下命令,使用子查询获取报价的最新版本。您可以
内部联接
此子查询与您的表,以获取每个组的最新修订的整行(编号
):
当您使用
分组依据
时,应始终在分组依据
中列出在选择
中使用的所有非聚集列。在您的情况下,正确的格式是按编号、状态、金额分组。省略列将导致不正确的结果。但是,由于您希望MAX(revision)
覆盖number
并且您正在使用MySQL 5.6,您需要使用Sebastian回答的子查询。当您使用GROUP by
时,您应该始终在GROUP by
中列出SELECT
中使用的所有非聚集列。在您的情况下,正确的格式是按编号、状态、金额分组。省略列将导致不正确的结果。但是,由于您希望MAX(revision)
覆盖number
,并且您正在使用MySQL 5.6,因此需要使用Sebastian回答的子查询。
SELECT quotes.*
FROM quotes INNER JOIN (
SELECT number, MAX(revision) AS revision
FROM quotes
GROUP BY number
) max_quotes ON quotes.number = max_quotes.number AND quotes.revision = max_quotes.revision
ORDER BY id DESC