2016-07-28 54 views
1

我有一个表,看起来像这样:MySQL的组/为了表现不同5.7

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被忽略。

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

回答

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文档

摘录:

使用此功能时,各组中的所有行应具有针对选自下组省略BY部分的列相同的 值。 服务器可自由返回组中的任何值,因此结果为 不确定,除非所有值都相同。