MySQL组/顺序在5.7中表现不同

时间:2016-07-28 10:52:30

标签: mysql

我有一个看起来像这样的表:

id | text      | language_id | other_id | dateCreated
 1 | something |           1 |        5 | 2015-01-02
 2 | something |           1 |        5 | 2015-01-01
 3 | something |           2 |        5 | 2015-01-01
 4 | something |           2 |        6 | 2015-01-01

我想获得每个具有other_id 5的language_id的最新行。

我的查询看起来像这样

SELECT *  (
    SELECT *
    FROM tbl
    WHERE other_id = 5 
    ORDER BY dateCreated DESC
) AS r 
GROUP BY r.language_id

使用MySQL 5.6我得到2行ID为1和3,这就是我想要的。

使用MySQL 5.7.10,我得到2行ID为2和3,在我看来,子查询中的ORDER BY被忽略。

任何想法可能是什么问题?

1 个答案:

答案 0 :(得分:4)

您应该使用以下查询:

SELECT 
*
FROM tbl
INNER JOIN 
(

    SELECT 
     other_id,
     language_id,
     MAX(dateCreated) max_date_created
    FROM tbl
    WHERE other_id = 5 
    GROUP BY language_id
) AS t 
ON tbl.language_id = t.language_id AND tbl.other_id = t.other_id AND 
   tbl.dateCreated = t.max_date_created

使用不带聚合函数的GROUP BY将以任意顺序选择行。您不应该依赖GROUP BY返回的行。 MySQL并不能确保这一点。

引用此 post

  

简而言之,MySQL允许省略GROUP BY中的某些列,   出于性能目的,这仅在省略时才有效   列都具有相同的值(在分组内),否则,   查询返回的值确实是不确定的   在这篇文章中被其他人猜到了。确保添加ORDER BY子句   不会重新引入任何形式的确定性行为。

     

虽然不是问题的核心,但此示例显示了如何使用*   而不是明确列举所需的列往往是一个坏的   想法。

     

摘自MySQL 5.0文档:

     

使用此功能时,每个组中的所有行都应该相同   GROUP BY部分中省略的列的值。该   服务器可以自由地从组中返回任何值,因此结果是   除非所有值都相同,否则不确定。