MariaDB和MYSQL5.6返回不同的结果

时间:2018-03-21 04:14:25

标签: mysql sql mariadb

我试图让桌面上最富有的用户。 该表包含所有交易和交易时间。 用户在银行的资金由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 Community Server (GPL)

5.5.56-MariaDB - MariaDB Server

表结构在这里

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);

1 个答案:

答案 0 :(得分:1)

允许按不在查询的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)

Stackoverflow上还有许多其他有用的答案,详细介绍了同一个问题。这是一个这样的问题:MySQL wrong results with GROUP BY and ORDER BY