2012-06-20 2 views
1

Я хочу, чтобы получить значения из строки с наибольшим определенным значением (в данном примере, старейший член)Выбор всех людей с максимальным возрастом?

Select * from members where age=max(age) 

Будет ли это работать?

И что произойдет, если будет более 1 самых старых членов с одинаковым возрастом?

(я не придется беспокоиться об этом, потому что я использую auto_increment, но я только что получил любопытный)

Спасибо.

+0

Do вы используете автоматическое увеличение по возрасту? –

+0

нет, возраст был всего лишь примером. – gyogyo0101

ответ

2
select * 
from members 
where age = (select max(age) as max_age from members); 

Если количество членов более одного члена с одинаковым максимальным возрастом, вы получите несколько результатов. Для того, чтобы выбрать только один из что:

select * 
from members 
where age = (select max(age) as max_age from members); 
limit 1 

При желании вы можете добавить order by, если вы предпочитаете какой-либо конкретной данные через случайную.

2

No.

Вы хотите

Select * from Members 
where Age = (Select Max(Age) from Members) 

Если, как это было предложено вашим упоминанием Autoincrement, вы ищете последний вставленный ID в таблице, вы хотите

Select LAST_INSERT_ID() 
2

Это не сработает, так как это Invalid use of group function, лучше использовать SELECT * FROM members ORDER BY age DESC LIMIT 1

0

Это будет возвращать только одну строку - даже если более одного члена имеют одинаковый максимальный возраст:

SELECT * 
FROM members 
ORDER BY age DESC 
LIMIT 1 ; 

(ответ и @ podiluska в) Это будет возвращать все из них:

SELECT m.* 
FROM members AS m 
    JOIN 
    (SELECT MAX(age) AS max_age 
     FROM members 
    ) AS allm 
    ON allm.max_age = m.age ; 
+0

Имена таблиц чувствительны к регистру. – vearutop

+0

@vearutop: Это зависит от настроек. –

0

Существует также более изобретательный способ сделать то же самое:

SELECT * FROM members m 
WHERE NOT EXISTS (
    SELECT 1 FROM members m2 
    WHERE m1.age < m2.age) 

Этот запрос переносимый для большинства да лабиринты, работы для автообновляющихся ПК, а также с несколькими людьми с одинаковым возрастом. Кроме того, по крайней мере, в SQL Server, большая часть времени будет быстрее, чем версия, используя подзапрос (особенно, если [members] имеет индекс по столбцу [возраст]).

1

Это может быть сделано с помощью одного ВЫБРАТЬ заявление, если вы используете GROUP BY и @variable, чтобы найти и сохранить то, что есть минимальное/максимальное значение и фильтра совпадает с HAVING в конце.

Предположив у вас есть таблица членов по крайней мере две колонки: идентификатор и возраст, то вы можете использовать такие заявления:

SELECT id, age, @max:= IF(@max > age, @max, age) FROM members GROUP BY id HAVING(age = @max); 

или

SELECT id, age, @min:= IF(@min < age, @min, age) FROM members GROUP BY id HAVING(age = @min); 
+0

Вот пример скрипта sql http://sqlfiddle.com/#!9/b6928/2 – xxxmatko

Смежные вопросы