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
동일한 쿼리가 다른 결과를 제공합니다.
테이블 구조는 여기에 있습니다.
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 BY 및 ORDER BY에서 MySQL 결과가 잘못되었습니다.
언급URL : https://stackoverflow.com/questions/49398077/mariadb-and-mysql5-6-returns-different-results
'prosource' 카테고리의 다른 글
R에 있는 그림의 첨자 (0) | 2023.09.05 |
---|---|
데이터 프레임을 그룹화하고 합계 AND 카운트를 구하시겠습니까? (0) | 2023.09.05 |
보기에 대한 쿼리를 빠르게 수행할 수 있도록 보기를 캐시하는 방법이 있습니까? (0) | 2023.09.05 |
웹 페이지의 실시간 데이터를 구현하는 방법 (0) | 2023.09.05 |
Python Django Rest Framework 순서가 지정되지 않은 ObjectList 주의 (0) | 2023.09.05 |