MySQL Union 정렬이 다른 서버에서 예기치 않게 작동합니다.
좋은 하루 되세요.
"오류" 쿼리에 문제가 있습니다.다른 서버에서 실행할 때 필요한 다른 결과 세트를 얻을 수 있습니다.
export-> import를 통해 모든 "테이블"을 다시 Import하려고 했는데 아직 동작하지 않습니다.
어디가 문제입니까?MariaDB에서 문제가 발생할 수 있습니까?
데이터베이스 버전:
- 5.6.27 - MySQL Community Server (GPL), 클라이언트: libmysql 5.0.11-dev
- 10.0.25-MariaDB-0+deb8u1 - (데비안), 클라이언트: libmysql 5.5.49
둘 다 MyISAM 엔진 상에서 동작합니다.
쿼리:
SELECT id, datum, ordinary FROM (SELECT *, 0 as `ordinary` FROM
`user_todolist` WHERE `done` = '0'
AND `deleted` = '0' AND `id_uzivatel` = '1' ORDER BY `datum` ASC) AS a1
UNION
SELECT id, datum, ordinary FROM (SELECT *, 1 as `ordinary` FROM
`user_todolist` WHERE `done` = '1' AND `deleted` = '0' AND
`id_uzivatel` = '1' ORDER BY `datum` DESC) AS a2
ORDER BY `ordinary`
결과(왼쪽 예상, 오른쪽 잘못됨):
SQL 설명(상단이 예상됨, 봇이 잘못됨)
ORDER BY
반드시 안정된 타입은 아닙니다.신청시ORDER BY
의 결과로UNION
그룹 내에서 순서를 변경할 수 있습니다.
필요없습니다ORDER BY ordinary
외부 쿼리로 이동합니다.사용할 때UNION
결과는 보통 하위 항목 순서로 나타나기 때문에 첫 번째 항목의 결과는SELECT
첫 번째가 될 것이고 두 번째가 될 것이다.SELECT
그 후에.
옷을 갈아입어야 한다UNION
로.UNION ALL
,그래도.디폴트로는UNION DISTINCT
즉, 중복을 제거하려면 쿼리 결과를 조합해야 합니다.쿼리 간에 중복이 있을 수 없기 때문에(두 쿼리는 서로 다르기 때문에)ordinary
columns) 이것은 불필요합니다.
이것에 의존하지 않는 또 다른 솔루션(보증이 되는지는 잘 모르겠습니다)은,ORDER BY datum
서브쿼리 중 하나를 사용하여 메인쿼리를 설정합니다.
ORDER by ordinary, IF(ordinary = 0, datum, '') ASC, IF(ordinary = 1, datum, '') DESC
- ANSI 규격에 따르면
ORDER BY
서브쿼리에서는 무시할 수 있습니다.이는 표에 행에 고유 순서가 없음을 나타내는 것과 같습니다. - 최근 Oracle과 MariaDB(분명히 독립적으로) 모두 이 표준을 활용하기 시작했습니다.
UNION ALL
값의 중복이 없고, 보다 고속이기 때문에 적절합니다.UNION DISTINCT
디커버리 패스가 없기 때문에.UNION
는 기존에는 임시 테이블을 작성하고, 1개의 선택 항목에서 행을 입력한 후, 다음 선택 항목으로 이동하는 방식으로 구현되어 왔습니다.- 최근에는 특정 상황에서 임시 테이블이 필요하지 않게 되었습니다.이것은 훌륭한 최적화입니다.
- 미래에는 여러 스레드가 다음 작업을 수행할 것으로 예상됩니다.
SELECTs
병렬로이렇게 하면 물건이나 주문 방법에 대해 현재 즐길 수 있는 모든 가정이 완전히 무효가 됩니다.
결론:내부 분리ORDER BYs
인 것을 덧붙입니다.ORDER BY
@Barmar @Barmar bar다다다다다다다barbarbarbarbarbarbarbarbarbar @Barmar?
이렇게 하면 MySQL/MariaDB의 모든 과거, 현재 및 미래 버전에서 쿼리가 '올바르게' 작동합니다.(몇 년 전 이 문제로 인해 처음 작성되었습니다.)여기)
완전히 삭제되기 전에 InnoDB로 전환하십시오.
언급URL : https://stackoverflow.com/questions/42916203/mysql-union-sort-works-unexpected-at-different-server
'programing' 카테고리의 다른 글
vuex 지속 상태:클래스 인스턴스 저장 중.베스트 프랙티스가 있나요? (0) | 2022.09.28 |
---|---|
ImportError: pip이라는 이름의 모듈이 없습니다. (0) | 2022.09.28 |
Google Chrome Console에서 모든 JavaScript 변수 목록 보기 (0) | 2022.09.28 |
MariaDB 여러 행을 단일 행으로 선택 (0) | 2022.09.28 |
sql 1행에서 near "를 사용하는 올바른 구문 (0) | 2022.09.28 |