2016-07-28 2 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에 대한 모든 최신 행을 얻으려면 like

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

MySQL 5.6에서는 ID 1과 3을 가진 2 행을 얻습니다. 이것은 원하는 것입니다.

MySQL 5.7.10에서는 ID 2와 3의 2 행을 얻었고 하위 쿼리의 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 절을 추가하려면 은 어떤 형태의 결정적 동작도 다시 도입하지 않습니다.

문제의 핵심은 아니지만이 예에서는 원하는 열의 명시적인 열거 대신 * 을 사용하면 종종 아이디어가 잘못 표시되는 것을 보여줍니다. 5.0 문서에서

발췌이 기능을 사용하는 경우

, 각 그룹의 모든 행함으로써 부분 GROUP 생략 열에 대한 동일한 값을 가져야한다. 서버는 그룹에서 임의의 값을 반환 할 수 있으므로 모든 값이 동일하지 않으면 결과는 입니다.