Форум: "Прочее";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];
ВнизСложности с запросом Найти похожие ветки
← →
nekepka (2008-04-03 22:13) [0]Не знаю куда отправить. FireBird, таблица в три поля: ID (Primary Key, автоинкремент на генераторах-тригерах), Value (целое), UserID (целое). Можно ли одним запросом получить минимальное значение Value для каждого UserID, и при этом, в той же записи получить значение ID, для которого и было выбрано это минимальное Value. Без вложенных запросов. Очень нужно.
Без ID все понятноselect min(value) as min_value, UserID
Но как узнать, какая запись содержит это минимальное значение? И или хотя бы первую из них, если минимальных для одного UserID несколько. Заранее спасибо.
from Table
group by UserID
← →
oldman © (2008-04-03 22:16) [1]
> Но как узнать, какая запись содержит это минимальное значение?
> И или хотя бы первую из них, если минимальных для одного
> UserID несколько.
О сортироке слышал?
← →
nekepka (2008-04-03 22:18) [2]
> О сортироке слышал?
И о фильтрации, но как это мне поможет?
← →
ага (2008-04-03 22:21) [3]
> nekepka (03.04.08 22:18) [2]
select first (1) bla-bla from bla-bla where bla-bla
order by id desc
← →
oldman © (2008-04-03 22:23) [4]
> И или хотя бы первую из них, если минимальных для одного
> UserID несколько. Заранее спасибо.
Сортировка не меняет их местами.
Первая в выборке и есть первая в базе.
← →
Johnmen © (2008-04-03 22:25) [5]
> nekepka (03.04.08 22:13)
Без вложенного запроса никак.
← →
nekepka (2008-04-03 22:27) [6]Да чтож вы на последней части-то сосредоточились.
> Можно ли одним запросом получить минимальное значение Value
> для каждого UserID, и при этом, в той же записи получить
> значение ID, для которого и было выбрано это минимальное
> Value
← →
ага (2008-04-03 22:32) [7]
> nekepka (03.04.08 22:27) [6]
>
> Да чтож вы на последней части-то сосредоточились.
см. [5]
← →
Prohodil Mimo © (2008-04-03 22:39) [8]ага (03.04.08 22:21) [3]
ему надо минимальное, а не максимальное, и не id, а value
если я правильно понял, то так:select first 1 value as min_value, UserID, Id
from Table
order by value
← →
Prohodil Mimo © (2008-04-03 22:41) [9]но мой вариант только для одной записи, если надо для каждого, то без вложенных никак, или ХП.
← →
nekepka (2008-04-03 22:42) [10]
> Без вложенного запроса никак.
Это, что, как-то так:
select T1.*
from MyTable T1
WHERE
T1.Value in
(
select min(T2.Value)
from MyTable T2
where
T2.UserID = T1.UserID
)
order by T1.Value
← →
Johnmen © (2008-04-03 22:46) [11]
> nekepka (03.04.08 22:42) [10]
Как-то так. Только не in, а =
← →
nekepka (2008-04-03 22:52) [12]
> Как-то так. Только не in, а =
Да, только ведь оно "целое", которое Min, поэтому в подселекте может быть и не одна запись, кроме того, буквально на днях, и именно для FireBird, прочитал, что в случае с IN, планы строятся пооптимальнее.
← →
Johnmen © (2008-04-03 22:55) [13]
> поэтому в подселекте может быть и не одна запись,
Да ты что?
:)))
> и именно для FireBird, прочитал, что в случае с IN, планы
> строятся пооптимальнее.
Пооптимальнее чего?
← →
ага (2008-04-03 23:01) [14]
> в случае с IN, планы строятся пооптимальнее.
Нифига себе... Это с какой версии??
← →
kaif © (2008-04-03 23:01) [15]А так нельзя?
select first 1 min(value), UserID
from Table
group by UserID
order by 1
← →
ага (2008-04-03 23:03) [16]
> kaif © (03.04.08 23:01) [15]
>
> А так нельзя?
Неа. ID еще надо.
← →
nekepka (2008-04-03 23:08) [17]
> ага (03.04.08 23:01) [14]
Что прочитал, то и озвучил. Может быть зря?
http://www.interface.ru/fset.asp?Url=/borland/nihvop.htm
← →
nekepka (2008-04-03 23:11) [18]
> ага (03.04.08 23:03) [16]
Именно ;)
← →
Johnmen © (2008-04-03 23:12) [19]Это не твой случай.
Впрочем, никто не мешает сравнить реальные планы.
← →
ага (2008-04-03 23:18) [20]
> nekepka (03.04.08 23:08) [17]
На дату смотрел? 15.07.02
← →
ага (2008-04-03 23:20) [21]Да и FB совсем-совсем не IB. Так что бегом на ibase.ru
← →
nekepka (2008-04-03 23:20) [22]
> На дату смотрел?
Ну тогда это ответ на "...с какой версии.." :)))
← →
nekepka (2008-04-03 23:24) [23]
> ага (03.04.08 23:20) [21]
Да ходил, и не раз... Может плохо ходил... Не будем распыляться: я пока кроме варианта [10] не вижу ничего. Но как удручает вложенный запрос!!!
← →
ага (2008-04-03 23:25) [24]
> nekepka (03.04.08 23:20) [22]
>
>
> > На дату смотрел?
> Ну тогда это ответ на "...с какой версии.." :)))
Угу... Счас. Вот как раз большие траблы с IN в FB 1.0 и были. А в статье говорится о IB,
причем неизвестной версии.
← →
ага (2008-04-03 23:27) [25]
> nekepka (03.04.08 23:24) [23]
нет ничего плохого во вложенном запросе.
← →
nekepka (2008-04-03 23:34) [26]
> нет ничего плохого во вложенном запросе.
Плохого нет - точно, раз в синтаксисе присутствует, просто думал, может чего не знаю, чего не дочитал, может можно пооптимальнее как-то...
Большое Спасибо всем отозвавшимся!
← →
kaif © (2008-04-04 15:40) [27]Можно и с помощью запроса SELECT к хранимой процедуре сделать.
На любом IB заработает.
Надеюсь одному VALUE у юзера соотвествует только один ID. Хотя это заработает в любом случае. По сути это эквивалент вложенного запроса.
CREATE PROCEDURE PROCEDURE1
RETURNS(VALUE INTEGER, USERID INTEGER)
AS
BEBIN
FOR SELECT MIN(VALUE),USERID
FROM TABLE1
GROUP BY USER_ID
INTO :VALUE, :USERID
DO BEGIN
FOR SELECT ID FROM TABLE1 WHERE USERID=:USERID AND VALUE=:VALUE
INTO :ID
DO SUSPEND;
END
END
← →
kaif © (2008-04-04 15:41) [28]Извиняюсь, ID вернуть забыл:
CREATE PROCEDURE PROCEDURE1
RETURNS(ID INTEGER, VALUE INTEGER, USERID INTEGER)
AS
BEBIN
FOR SELECT MIN(VALUE),USERID
FROM TABLE1
GROUP BY USER_ID
INTO :VALUE, :USERID
DO BEGIN
FOR SELECT ID FROM TABLE1 WHERE USERID=:USERID AND VALUE=:VALUE
INTO :ID
DO SUSPEND;
END
END
← →
ага (2008-04-04 15:52) [29]
select min(value) as min_value, min(ID) as min_id, UserID
from Table
group by UserID
=))
← →
Kerk © (2008-04-04 16:53) [30]
> kaif © (04.04.08 15:41) [28]
Скинь плиз контакты в почту или в аську, у тебя анкета слетела
← →
Johnmen © (2008-04-04 18:48) [31]
> ага (04.04.08 15:52) [29]
Это про что?
← →
ага (2008-04-04 19:11) [32]
> Johnmen © (04.04.08 18:48) [31]
>
>
> > ага (04.04.08 15:52) [29]
>
> Это про что?
>
Это про
> Можно ли одним запросом получить минимальное значение Value
> для каждого UserID, и при этом, в той же записи получить
> значение ID, для которого и было выбрано это минимальное
> Value.
...
> И или хотя бы первую из них, если минимальных для одного
> UserID несколько.
Самый подходящий вариант - [29]
← →
Johnmen © (2008-04-04 19:14) [33]
> ага (04.04.08 19:11) [32]
> Это про
>> Можно ли одним запросом получить минимальное значение Value
>> для каждого UserID, и при этом, в той же записи получить
>> значение ID, для которого и было выбрано это минимальное
>> Value.
Кхм... Ты серьезно?
← →
ага (2008-04-04 19:21) [34]
> Johnmen © (04.04.08 19:14) [33]
А что не так? Автору же по барабану, какой именно ид
> > И или хотя бы первую из них, если минимальных для одного
> > UserID несколько.
← →
Johnmen © (2008-04-04 19:40) [35]
> ага (04.04.08 19:21) [34]
> А что не так? Автору же по барабану, какой именно ид
Какому такому барабану?
> значение ID, для которого и было выбрано это минимальное Value.
← →
ага (2008-04-04 19:47) [36]
> Johnmen © (04.04.08 19:40) [35]
:-)
В таблице 3 поля. Получается, что userid и value попадаются одинаковые, но с разным id.
Если следовать
> > значение ID, для которого и было выбрано это минимальное
> Value.
то мы и выберем все записи с минимальным value но разными id для каждого userid.
Но! Читаем далее:
> > > И или хотя бы первую из них, если минимальных для одного
> > > UserID несколько.
>
Это жжж неспроста :) Так что выбираем min или max id и всех делов.
Ну надо автору поле id в выборке, что поделаешь :-)
← →
Johnmen © (2008-04-04 20:05) [37]
> ага (04.04.08 19:47) [36]
Бр-р-р... Какая ерунда...
Рассмотри конкретный пример:ID VALUE USERID
1 44 3
2 55 4
3 66 5
4 99 5
5 88 5
6 66 5
7 66 6
8 11 8
9 22 9
← →
Johnmen © (2008-04-04 20:06) [38]пардон, для ID=3 VALUE=77
← →
ага (2008-04-04 20:16) [39]
> Johnmen © (04.04.08 20:05) [37]
Проверял. Днем. Сейчас не на чем :)
Но, следуя логике получим
ID VALUE USERID
1 44 3
2 55 4
6 66 5
7 66 6
8 11 8
9 22 9
-- ну как-то так.
← →
ага (2008-04-04 20:19) [40]а если оставить как в [37], без уточнения в [38] то
ID VALUE USERID
1 44 3
2 55 4
3 66 5
7 66 6
8 11 8
9 22 9
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2008.05.18;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.059 c