MAX функция в предложении where mysql

21

Как я могу использовать функцию max() в where, где запрос mysql, я пытаюсь:

 select firstName,Lastname,MAX(id) as max where id=max;

это дает мне ошибку:

Unknown column 'max' in 'where clause'

Любая помощь? Спасибо заранее.

  • 4
    Вы должны принять ответ, данный spencer7593 на ваш вопрос
Показать ещё 1 комментарий
Теги:
max
greatest-n-per-group

8 ответов

31

Вы не можете ссылаться на результат агрегатной функции (например, MAX()) в предложении WHERE того же запроса.

Нормативным шаблоном для решения этого типа проблемы является использование встроенного представления, что-то вроде этого:

SELECT t.firstName
     , t.Lastname
     , t.id
  FROM mytable t
  JOIN ( SELECT MAX(mx.id) AS max_id
           FROM mytable mx
       ) m
    ON m.max_id = t.id

Это всего лишь один способ получить заданный результат. Существует несколько других подходов к получению одного и того же результата, и некоторые из них могут быть гораздо менее эффективными, чем другие. Другие ответы демонстрируют такой подход:

 WHERE t.id = (SELECT MAX(id) FROM ... )

Иногда самый простой подход - использовать ORDER BY с LIMIT. (Обратите внимание, что этот синтаксис специфичен для MySQL)

SELECT t.firstName
     , t.Lastname
     , t.id
  FROM mytable t
 ORDER BY t.id DESC
 LIMIT 1

Обратите внимание, что это вернет только одну строку; поэтому, если имеется более одной строки с одинаковым значением id, то это не будет возвращать все из них. (Первый запрос вернет ВСЕ строки, которые имеют одинаковое значение id.)

Этот подход может быть расширен, чтобы получить более одной строки, вы можете получить пять строк с наивысшими значениями id, изменив их на LIMIT 5.

Обратите внимание, что производительность этого подхода особенно зависит от доступного подходящего индекса (т.е. с id как PRIMARY KEY или в качестве ведущего столбца в другом индексе.) Подходящий индекс улучшит производительность запросов, используя все эти подходы.

9

Используйте подзапрос:

SELECT row  FROM table  WHERE id=(
    SELECT max(id) FROM table
)

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

5
SELECT firstName, Lastname, MAX(id) as max WHERE YOUR_CONDITIONS_HERE HAVING id=max(id) 
3

Некоторые версии Mysql запрещают "ограничение" внутри подбора select. Мой ответ вам (и мне в будущем) было бы использовать группы

select firstName,Lastname,id 
where {whatever}
group by id
having max(id)

Это позволяет вам возвращать все, что вы хотите, в области выбора, не имея агрегированного поля.

  • 0
    Если бы я видел это месяц или 6 назад. Просто и эффективно. Любить это!
  • 0
    что мы должны ввести, где, если все отсортировано с помощью группы и с ....
Показать ещё 1 комментарий
1

Вы хотите, чтобы имя и фамилия строки с наибольшим id?

Если да (и вам не было предложения FROM):

SELECT firstname, lastname, id
FROM foo
ORDER BY id DESC
LIMIT 1;
1

Синтаксис, который вы использовали, неверен. Запрос должен выглядеть примерно так:

SELECT column_name(s) FROM tablename WHERE id = (SELECT MAX(id) FROM tablename)
0

Этот запрос должен вернуть вам нужные данные. Замените foo именем таблицы, которое вы используете.

SQL-запрос:

select firstName,Lastname, id 
from foo 
having max(id) = id 
  • 0
    на самом деле, запрос этой формы будет часто возвращать ноль строк sqlfiddle.com/#!9/96a529/2
-3

В качестве псевдонима для столбца используется слово max. Попробуйте:

MAX(id) as mymax ... WHERE ID - mymax
  • 7
    -1 Нельзя ссылаться на псевдонимы столбцов в предложении WHERE, а также нельзя ссылаться на результат агрегатных функций в предложении WHERE. Этот ответ совершенно неверен.
  • 1
    Первое предложение в этом ответе является правильным, то есть max используется в качестве псевдонима для выражения в списке выбора. Но после этого наблюдения ответ не имеет никакого смысла. Во-первых, MAX не является зарезервированным словом. Ссылка: http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html . Какой смысл использовать другой псевдоним? Это не решает проблему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню