Подтвердить что ты не робот

Как выбрать строку максимального значения в таблице mysql

У меня есть следующая таблица

Структура таблицы:

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?

4b9b3361

Ответ 1

Вопрос 1: Что я сделал здесь ошибку и почему эта функция MAX не возвращает соответствующую информацию о строках?

Вам нужно прочитать предложение group by.

MySQL намного более разрешительный, чем следовало бы, внося путаницу в процесс. В принципе, любой столбец без агрегата должен быть включен в предложение group by. Но синтаксический сахар MySQL позволяет "забыть" столбцы. Когда вы это делаете, MySQL выплевывает произвольное значение из набора, с которым он группируется. В вашем случае первая строка в наборе bob, поэтому она возвращает это.

Вопрос 2: Какой из них хорош для использования, чтобы увеличить производительность MAX или предложение ORDER BY?

Ваш первый оператор (используя max() без group by) просто неверен.

Если вам нужен один из самых старых пользователей, order by age desc limit 1 - правильный способ продолжения.

Если вам нужны все самые старые пользователи, вам нужен подзапрос:

SELECT p.* FROM people p WHERE p.age = (select max(subp.age) from people subp);

Ответ 2

попробуйте это

SELECT age, name FROM  `people` where age = (SELECT max(age) FROM  people)

Ответ 3

Еще одно решение без использования агрегированных функций и группировок:

SELECT * FROM people ORDER BY age DESC LIMIT 1

Ответ 4

Что я сделал здесь ошибку и почему эта функция MAX не возвращает соответствующую информацию о строках?

MAX возвращает правильное значение, но другой выбранный вами столбец дает вам "случайное" значение.

Выбор столбцов, которые не являются частью GROUPing (и я думаю, что неявная GROUP BY выполняется здесь, поскольку вы используете агрегированную функцию) является незаконным в строгом SQL-MySQL, однако игнорирует это (в зависимости от конфигурации сервера) и дает вам значение из "случайной" строки в таких случаях.


Ниже описаны альтернативные подходы: Строки, содержащие групповой максимум определенного столбца

Ответ 5

MAX - это функция aggregate. Это означает, что MySQL группирует все записи и обрабатывает их, как если бы они были в наборе результатов. Поскольку вы не указываете, как следует группировать столбец имен, результат этого может быть неожиданным. ORDER BY - отличный способ добиться желаемого результата. Просто не забудьте добавить index по возрасту, чтобы производительность не изменялась по мере роста таблицы.

Ответ 6

Вопрос 1: Если вы действительно хотите использовать MAX() вы можете попробовать это SELECT age, name FROM people WHERE age IN (SELECT MAX(age) FROM people);

Вопрос 2: Я думаю, это зависит от моего предложения в вопросе 1, вы делаете запрос дважды, но в ORDER BY решении, которое вы предоставили, база данных выполняла подобную процедуру.

Ответ 7

Есть интересная альтернатива, которая работает только на 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