17

我有下表

表结构:

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; 

插入一些值:

INSERT INTO `people` (`name`, `age`) VALUES 
('bob', 13), 
('john', 25), 
('steve', 8), 
('sue', 13); 

执行查询:

SELECT MAX(  `age` ) ,  `name` FROM  `people` WHERE 1

预期结果:

25, John

生成的结果

25, bob

我们可以通过使用这个查询来实现这一点

SELECT `age`,  `name` FROM  `people` ORDER BY age DESC LIMIT 1

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

问题2:用MAX函数还是ORDER BY子句哪个好用?

4

7 回答 7

22

问题 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);
于 2013-06-26T11:14:36.353 回答
11

尝试这个

SELECT age, name FROM  `people` where age = (SELECT max(age) FROM  people)
于 2013-06-26T11:18:12.327 回答
8

另一个不使用聚合函数和分组的解决方案:

SELECT * FROM people ORDER BY age DESC LIMIT 1

于 2014-12-30T05:37:38.843 回答
3

我在这里犯了什么错误,为什么这个 MAX 函数不返回相关的行信息?

MAX 返回正确的值 - 但您选择的另一列只是给您一个“随机”值。

选择不属于 GROUPing 的列(我认为隐式 GROUP BY 在此处完成,因为您使用了聚合函数)在严格的 SQL 中是非法的 - 但是 MySQL 会忽略这一点(取决于服务器配置),并为您提供来自 a 的值在这种情况下“随机”行。


此处描述了替代方法:The Rows Hold the Group-wise Maximum of a certain Column

于 2013-06-26T11:15:08.680 回答
0

问题 1:如果你真的想使用 MAX() 你可以试试这个 SELECT age, name FROM people WHERE age IN (SELECT MAX(age) FROM people);

问题2:我认为这取决于我在问题1中的建议,您执行两次查询,但是在ORDER BY您提供的解决方案中,数据库执行了类似的过程。

于 2013-06-26T11:34:46.753 回答
0

MAX 是一个聚合函数。这意味着 MySQL 将所有记录分组并将它们视为结果集中的一条。由于您没有说明如何对名称列进行分组,因此结果可能出乎意料。ORDER BY 是实现预期结果的完美方式。只是不要忘记在年龄上添加索引,这样性能就不会随着表的增长而受到影响。

于 2013-06-26T11:16:22.843 回答
0

有一个有趣的替代方案只适用于 MySql!

SELECT `Name`, `Age` FROM 
(SELECT `Name`, `Age`, 1 AS `foo`
FROM `People`
ORDER BY `Age` DESC) AS `x`
GROUP BY `foo`

这是因为当没有聚合函数应用于给定列时,MySql 返回第一行

这是链接:http ://tominology.blogspot.com.br/2014/10/sql-row-with-max-value.html

于 2014-11-10T00:31:36.007 回答