prosource

MariaDB와 MYSQL 5.6이 서로 다른 결과를 반환함

probook 2023. 9. 5. 20:37
반응형

MariaDB와 MYSQL 5.6이 서로 다른 결과를 반환함

저는 테이블에서 가장 부유한 사용자를 얻으려고 했습니다.이 표는 모든 트랜잭션 및 트랜잭션 시간으로 구성됩니다.은행에 있는 사용자의 돈이 tstamp DESC에 의해 은행 잔액 주문의 최신 값에 의해 결정되었습니다.

SELECT b.bankid,b.bankbalance,b.remark,b.tstamp 
  FROM (SELECT * FROM `bank` WHERE 1 ORDER BY tstamp DESC) AS b 
 WHERE 1 
group by warid 
ORDER BY bankbalance DESC LIMIT 0,10

동일한 쿼리가 다른 결과를 제공합니다.

5.6.27 - MySQL 커뮤니티 서버(GPL)

5.5.56-MariaDB - MariaDB 서버

테이블 구조는 여기에 있습니다.

CREATE TABLE `bank` (
  `bankid` int(20) NOT NULL,
  `warid` int(11) NOT NULL,
  `fbid` varchar(50) NOT NULL,
  `banknumber` varchar(20) NOT NULL,
  `gross` int(20) NOT NULL,
  `bankbalance` bigint(11) NOT NULL,
  `remark` varchar(12) NOT NULL,
  `tstamp` double NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `bank` (`bankid`, `warid`, `fbid`, `banknumber`, `gross`, `bankbalance`, `remark`, `tstamp`) VALUES
(24, 22, '10001', 'banknumber', 5, 5, '', 1477155284),
(25, 22, '10001', 'banknumber', 1, 6, '', 1477155591.617),
(26, 22, '10001', 'banknumber', 1, 7, '', 1477155726.2211),
(27, 22, '10001', 'banknumber', 1, 8, '', 1477155730.1399),
(28, 22, '10001', 'banknumber', 1, 9, '', 1477155736.8127),
(29, 22, '10001', 'banknumber', 1, 10, '', 1477155743.4662),
(30, 23, '13332', 'banknumber', 5, 5, '', 1477155830),
(31, 23, '13332', 'banknumber', 1, 6, '', 1477155839.9243),
(32, 23, '13332', 'banknumber', 1, 7, '', 1477155842.8865),
(33, 23, '13332', 'banknumber', 1, 8, '', 1477155845.4773);

쿼리의 SELECT 부분에 없는 열을 기준으로 그룹화할 수 있는 기능은 MySql 확장입니다.다른 많은 데이터베이스에서는 허용되지 않습니다.v5.6 MySql 설명서(https://dev.mysql.com/doc/refman/5.6/en/group-by-handling.html) :

표준 SQL에서 GROUP BY 절을 포함하는 쿼리는 GROUP BY 절에 이름이 지정되지 않은 선택 목록의 집계되지 않은 열을 참조할 수 없습니다.

MySQL은 GROUP BY의 표준 SQL 사용을 확장하여 선택 목록이 GROUP BY 절에 이름이 지정되지 않은 집계되지 않은 열을 참조할 수 있도록 합니다.이것은 MySQL에서 이전 쿼리가 합법적이라는 것을 의미합니다.이 기능을 사용하면 불필요한 열 정렬 및 그룹화를 방지하여 성능을 향상시킬 수 있습니다.그러나 GROUP BY에 이름이 지정되지 않은 각 집계되지 않은 열의 모든 값이 각 그룹에 대해 동일한 경우에 주로 유용합니다.서버는 각 그룹에서 임의의 값을 선택할 수 있으므로, 동일하지 않은 경우 선택한 값은 결정되지 않습니다.또한 ORDER BY 절을 추가해도 각 그룹의 값 선택에 영향을 줄 수 없습니다.결과 집합 정렬은 값이 선택된 후에 수행되며, ORDER BY는 서버가 각 그룹 내에서 선택한 값에 영향을 주지 않습니다.

문서의 단점은 쿼리를 그대로 작성할 때 ORDER BY 절을 추가하더라도 순서에 영향을 줄 수 없다는 것입니다.결과 순서가 불확실합니다.

동일한 데이터베이스와 버전의 두 인스턴스를 실행하는 경우에도 동일한 쿼리로 다른 결과를 얻을 수 있습니다.솔루션은 ANSI 표준을 충족하도록 쿼리를 다시 작성하고 그룹을 명시적으로 정의하는 것입니다.

SQL은 다음과 같이 나타날 수 있습니다.

SELECT b.warid, b.bankbalance
  FROM bank b
       INNER JOIN (SELECT warid, max(tstamp) AS tstamp FROM bank GROUP BY warid) b2
       ON (b.warid = b2.warid AND b.tstamp = b2.tstamp)

스택 오버플로에 대해서는 이와 같은 질문에 대해 자세히 설명하는 여러 유용한 답변이 있습니다.다음과 같은 질문이 있습니다.GROUP BYORDER BY에서 MySQL 결과가 잘못되었습니다.

언급URL : https://stackoverflow.com/questions/49398077/mariadb-and-mysql5-6-returns-different-results

반응형