我试着把最有钱的人弄到桌子上。此表由所有事务和事务时间组成。用户在银行中的钱是由银行余额指令的最新价值决定的。
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);发布于 2018-03-21 05:07:12
允许按列分组(而不是在查询的SELECT部分)的特性是一个MySql扩展。这在许多其他数据库中是不允许的。根据v5.6 MySql文档(https://dev.mysql.com/doc/refman/5.6/en/group-by-handling.html):
在标准SQL中,包含GROUP BY子句的查询不能引用select列表中未在GROUP BY子句中命名的非聚合列。 MySQL扩展了组的标准SQL用法,以便select列表可以引用GROUP子句中未命名的非聚合列。这意味着前面的查询在MySQL中是合法的。通过避免不必要的列排序和分组,您可以使用此特性获得更好的性能。但是,当组中未命名的每个非聚合列中的所有值对于每个组都相同时,这主要是有用的。服务器可以自由地从每个组中选择任何值,因此,除非它们是相同的,否则所选择的值是不确定的。此外,添加ORDER子句不会影响每个组的值选择。结果集排序发生在选择了值之后,而ORDER不影响服务器选择的每个组中的值。
文档中的接收消息是,当您按照已有的方式编写查询时,即使添加了ORDER子句,也不能影响排序。结果排序是不确定的。
即使您运行的是相同数据库和版本的两个实例,您也很可能得到相同查询的不同结果。解决方案是重写查询以满足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错误结果与按组排序。
https://stackoverflow.com/questions/49398077
复制相似问题