我有一个看起来像这样的表:
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被忽略。
任何想法可能是什么问题?
答案 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部分中省略的列的值。该 服务器可以自由地从组中返回任何值,因此结果是 除非所有值都相同,否则不确定。