prosource
sqlfiddle.com 5.5.30 및 MariaDB 5.5.31의 다른 결과
probook
2023. 11. 4. 10:52
반응형
sqlfiddle.com 5.5.30 및 MariaDB 5.5.31의 다른 결과
sqlfidle: http://sqlfiddle.com/ #!2/9a8b3/1
fiddle에서 구조와 데이터, 쿼리를 가져와 MariaDB 5.5.31로 가져오면 다른 결과를 얻을 수 있습니다.
스클피들
PID NAME LEAGUEPOINTS TOTALLEAGUEPOINTS
2 Peter 16,13,9,4,2 44
1 Daniel 3425,543,234,43,29,22,21,21,19,17,13,12,12,12,11,9,9,9,8,7 4476
마리애드브
pid name leaguepoints totalleaguepoints
2 Peter 16,13,9,4,2 44
1 Daniel 3425,543,234,43,29,22,21,21,19,17,13,12,12,12,11,9,9,9,8,7,7,6,5,5,4,4,4,3,3,2,1 4520
쿼리:
SELECT
p.pid,
p.name,
GROUP_CONCAT( gC.leaguepoints ORDER BY leaguepoints DESC ) AS leaguepoints,
SUM(gC.leaguepoints) AS totalleaguepoints
FROM test_golf_player p
LEFT JOIN
(
SELECT pid, leaguepoints, @Sequence:=IF(@PrevPid = pid, @Sequence + 1, 0) AS aSequence, @PrevPid := pid
FROM
(
SELECT pid, leaguepoints
FROM test_golf_card
ORDER BY pid, leaguepoints DESC
) Sub1
CROSS JOIN (SELECT @PrevPid := 0, @Sequence := 0) Sub2
) gC
ON p.pid = gC.pid AND aSequence < 20
GROUP BY p.pid
ORDER BY p.name DESC
왜 그런지 추측이라도?
MariaDB를 사용할 수 없지만, 사용자 변수가 어떻게 출력되는지 확인하기 위해 다음을 시도해 주실 수 있나요:-
SELECT *
FROM test_golf_player p
LEFT JOIN
(
SELECT pid, leaguepoints, @Sequence:=IF(@PrevPid = pid, @Sequence + 1, 0) AS aSequence, @PrevPid := pid
FROM
(
SELECT pid, leaguepoints
FROM test_golf_card
ORDER BY pid, leaguepoints DESC
) Sub1
CROSS JOIN (SELECT @PrevPid := 0, @Sequence := 0) Sub2
) gC
ON p.pid = gC.pid
ORDER BY p.name DESC
편집 - 결과를 보면 MariaDB가 하위 쿼리의 ORDER BY를 무시한 것 같습니다.따라서 시퀀스 번호는 랜덤 순서이며, PID가 변경되면(순서가 고정되지 않아 랜덤으로 변경됨) 재설정됩니다.약간의 구글과 이것은 MariaDB의 의도적인 기능인 것 같습니다.SQL 표준에서는 테이블을 정렬되지 않은 행 집합으로 정의하고 하위 선택 항목은 테이블로 처리되므로 의 순서는 무시됩니다(https://kb.askmonty.org/en/why-is-order-by-in-a-from-subquery-ignored/ .
그것은 약간 불리한 점입니다.지금은 생각이 안 나서 주변에 일이 있는지 잘 모르겠어요.이것이 원래의 문제를 다루기 위해서였던 것에 대해서는 아마도 효율적이지 않을 상관된 하위 선택을 사용하는 것이 필요할 것이라고 생각합니다.
언급URL : https://stackoverflow.com/questions/17547108/different-results-in-sqlfiddle-com-5-5-30-and-mariadb-5-5-31
반응형