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