Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 意外的分组行为?_Mysql_Mysql 5.6 - Fatal编程技术网

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