Получение записи с минимальным значением 2х полей

_RVK_

Новичок
Получение записи с минимальным значением 2х полей

Есть таблица:
| id | x | y |
----------------
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 1 |
| 4 | 2 | 2 |
| 5 | 3 | 1 |
...

Мне нужно получить запись с минимальным значением x и y.
Первое что приходит на ум SELECT id FROM table ORDER BY x,y LIMIT 0,1

Есть ли более оптимальные варианты?

И еще, никогда до этого не пользовался оператором HAVING.
Работает как надо следующая конструкция:

SELECT id FROM table HAVING x<MAX(x) AND y<MAX(y)

То ли я не выспался.... В мане про HAVING мало чего написано. Может кто раскажет чем он отличается от WHERE, и почему вышеприведенный запрос возвращает 1,1,1.
 

Demiurg

Guest
а если первой записи нет, то что должно получиться ?
 

_RVK_

Новичок
Что должно незнаю, но получается 2,1,2. Это то что нужно, но я не пойму почему.

-~{}~ 04.11.04 11:55:

Тьфу блин, он просто возвращает мне первую запись из выборки
 

Demiurg

Guest
что значит "незнаю" ?
ты задачу можешь поставить прежде чем её решать ?
 

_RVK_

Новичок
Даже не из выборки, ORDER BY ничего не меняет.

-~{}~ 04.11.04 12:01:

Demiurg
Представь декартову систему координат. Так вот мне нужно получить самый первый элемент и самый последний. Кроме предложеного мной первого варианта, есть другие, лучше?
 

Demiurg

Guest
в декартовой системе нет первого и последнего элемента. Первые и последние есть только у нумерованых множеств.
 

_RVK_

Новичок
Demiurg
так и знал что придерешся :) Мне нужно получить точку с наименьшими координатоми x и y и с наибольшими.
 

Demiurg

Guest
есть две точки (1,0) и (0,1) у какой, по-твоему "меньшие" координаты ?
 

neko

tеam neko
И еще, никогда до этого не пользовался оператором HAVING.
это условие наложенное на результат работы агрегатной функции
не может быть чтобы не было
 

Demiurg

Guest
>у той, у которой меньше x.
тогда твой запрос то, что нужно.
 

_RVK_

Новичок
тогда твой запрос то, что нужно
Хорошо. Сеньк.

А что с HAVING, не пойму почему он так работает.
Мне вот кажется что этот запрос должен возвратить мне не одну, а все записи, у которых x<3 и y<2. Почему он всегда возвращает одну запись.
 

Demiurg

Guest
>Не понял.... что делать?
как я понял, тебе надо получить все точки у которых x и y меньше максимальных имеющихся.
 

_RVK_

Новичок
Нет, мне нужно понять почему данный запрос работает именно так.
 

ForJest

- свежая кровь
Diesel
HAVING это WHERE для агрегатных функций. Так понятно?
 

Groove

Новичок
Re: Получение записи с минимальным значением 2х полей

Автор оригинала: Diesel
В мане про HAVING мало чего написано. Может кто раскажет чем он отличается от WHERE, и почему вышеприведенный запрос возвращает 1,1,1.
Автор оригинала: http://www.linuxshare.ru/docs/software/SQL/postgresql/tutorial/tutorial-agg.html

Очень важно понимать различия между агрегатами и такими конструкциями SQL как WHERE и HAVING. Фундаментальное отличие между WHERE и HAVING состоит в следующем: WHERE выбирает входящие записи перед группированием и вычислениями агрегатами (а значит управляет тем, какие записи попадут в агрегатные функции), в то время как HAVING выбирает группу записей после группирования и вычисления агрегатов. Таким образом, предложение WHERE не должно содержать агрегатных функций; оно не оказывает влияния на попытку использовать агрегаты для того, чтобы определить какие записи будут переданы агрегатам. С другой стороны предложение HAVING всегда содержит агрегатные функции. (Вкратце, вам разрешается писать предложение HAVING, которое не использует агрегаты, но это непроизводительно: такое же условие можно использовать в предложении WHERE с большей эффективностью).
 
Сверху