Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.05.18;
Скачать: CL | DM;

Вниз

Сложности с запросом   Найти похожие ветки 

 
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
from Table
group by UserID
 Но как узнать, какая запись содержит это минимальное значение? И или хотя бы первую из них, если минимальных для одного 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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.021 c
6-1185709539
Новичек
2007-07-29 15:45
2008.05.18
Работа с Telnet.


2-1208283564
prodex
2008-04-15 22:19
2008.05.18
Асинхронные сокеты


2-1208518214
lewka-serdceed
2008-04-18 15:30
2008.05.18
Не понятные символы в строке


15-1207403489
TIF
2008-04-05 17:51
2008.05.18
Подскажите, а то фантазия даёт сбой :-(


15-1206929508
slider007
2008-03-31 06:11
2008.05.18
С днем рождения ! 31 марта 2008 понедельник