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)
| 归档时间: |
|
| 查看次数: |
41716 次 |
| 最近记录: |