Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.059 c
3-1197374036
em240
2007-12-11 14:53
2008.05.18
Оповещение+mssql2000


15-1207063416
TStas
2008-04-01 19:23
2008.05.18
Как научиться писать СОМ интерфейсы?


15-1207558304
GanibalLector
2008-04-07 12:51
2008.05.18
Subscribe.Ru (рассылка от Мастера DELPHI)


2-1208623339
Alexey
2008-04-19 20:42
2008.05.18
Как свернуть форму


6-1185251532
Inearthed
2007-07-24 08:32
2008.05.18
Продолжение пересылки файлов на FTP после обрыва связи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский