如何在mysql表中选择最大值行

Sun*_*dar 17 mysql performance

我有下表

表结构:

CREATE TABLE IF NOT EXISTS `people` ( 
`name` varchar(10) NOT NULL, 
`age` smallint(5) unsigned NOT NULL, 
PRIMARY KEY (`name`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
Run Code Online (Sandbox Code Playgroud)

插入一些值:

INSERT INTO `people` (`name`, `age`) VALUES 
('bob', 13), 
('john', 25), 
('steve', 8), 
('sue', 13); 
Run Code Online (Sandbox Code Playgroud)

执行查询:

SELECT MAX(  `age` ) ,  `name` FROM  `people` WHERE 1
Run Code Online (Sandbox Code Playgroud)

预期结果:

25, John
Run Code Online (Sandbox Code Playgroud)

生成的结果

25, bob
Run Code Online (Sandbox Code Playgroud)

我们可以通过使用此查询来实现此目的

SELECT `age`,  `name` FROM  `people` ORDER BY age DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud)

问题1:我在这里弄错了为什么这个MAX函数没有返回相关的行信息?

问题2:哪一个好用,增加性能MAX函数或ORDER BY子句?

Den*_*rdy 21

问题1:我在这里弄错了为什么这个MAX函数没有返回相关的行信息?

您需要阅读该group by条款.

MySQL比它应该允许的更宽松,在这个过程中引入了混乱.基本上,任何没有聚合的列都应包含在该group by子句中.但MySQL语法糖允许"忘记"列.当你这样做时,MySQL会从它所分组的集合中吐出一个任意值.在您的情况下,集合中的第一行是bob,所以它返回.

问题2:哪一个好用,增加性能MAX函数或ORDER BY子句?

你的第一个声明(使用max()没有a group by)是完全错误的.

如果您想要最老的用户之一,那么这order by age desc limit 1是正确的方法.

如果您想要所有最老的用户,则需要一个子选择:

SELECT p.* FROM people p WHERE p.age = (select max(subp.age) from people subp);
Run Code Online (Sandbox Code Playgroud)


Nap*_*ter 11

试试这个

SELECT age, name FROM  `people` where age = (SELECT max(age) FROM  people)
Run Code Online (Sandbox Code Playgroud)


小智 8

另一种不使用agregate函数和分组的解决方案:

SELECT * FROM people ORDER BY age DESC LIMIT 1