![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL-запрос для выборки данных [D7, FIREBIRD]
serguncho © (2005-07-22 22:47:00)Добрый вечер!
Помогит разрешите проблему с запросом, пожалуйста.
Имею таблицу (tablica) c полями
NOMER_CLENA INTEGER,
POL_CLENA VARCHAR(1), /может быть М (мальчОнка) или F (девчОнка)/
CARD_CLENA VARCHAR(5), /пол+номер, например, F4/
RAITING FLOAT,
...
Мне нужно выбрать две самых рейтинговых дивчины и два самых-самых парня.
Думал сначала отсортировать по рейтингу и выбрать 4 души:
select first 4(*) from tablica order by RAITING
но понял ошибку, т.к. могут получиться 4 парня или 3 девушки и один парень, а никак не 50/50.
Подскажите, как организовать грамотный запрос по выборке людей (причем кол-во может быть и не пропорционально 1\1, а, например, 3 девушки- и 2 парня-лидера).
Deniz (2005-07-25 12:22:00) [1]... ну или ХП написать, там то все точно оптимизировать можно
Deniz (2005-07-25 12:21:00) [2]Согласен, фигню спорол, но для повышения производительности запроса, предлагаю к [14] добавить
SELECT first 2* FROM TABLICA WHERE ID IN (select first 2 ID from TABLICA where POL_CLENA='m' ORDER BY 7 desc)
union
SELECT first 2* FROM TABLICA WHERE ID IN (select first 2 ID from TABLICA where POL_CLENA='f' ORDER BY 7 desc)
вроде, как только найдется 2 мальчика, то первый запрос закончит свое выполнение, а не будет дальше перебирать оставшиеся записи, и соот-но с девочками
Nikolay M. (2005-07-25 11:04:00) [3]
> Johnmen © (25.07.05 11:01) [26]
Продыши, а то можно язву желудка заработать :)
Johnmen (2005-07-25 11:01:00) [4]
> Nikolay M. © (25.07.05 10:43) [25]
Конечно обиделся, на себя. :^)
Nikolay M. (2005-07-25 10:43:00) [5]
> Johnmen © (25.07.05 10:34) [24]
Обиделся? :)
Johnmen (2005-07-25 10:34:00) [6]Ну словоблуд, так и ладно...
Nikolay M. (2005-07-25 10:21:00) [7]
> Johnmen © (25.07.05 10:08) [21]
Блин. Ему не надо сначала девочки, а потом мальчики. Ему надо 2 топовых девочки и 2 топовых мальчика.
Оба запроса из [18] вернут по две случайных (грубо говоря) записи, т.к. в запросах не указан порядок сортировки. И только потом эти 4 записи отсортируются по полу и рейтингу. В общем случае они не будут самыми рейтинговыми.
sniknik (2005-07-25 10:20:00) [8]точку поставили еще в serguncho © (23.07.05 19:11) [15]
дальще пошол словоблуд... (тоже ничего себе занятие ;)
а автору надо не сортировать сначала девочки, потом мальчики, а TOP из 2 мальчиков и TOP двух девочек... сортировка здесь это только средство выбрать "крайних".
разница всетаки есть, выбирать сначала из М после из Ж (первых попавшихся если нет сортировки) и после сортировать, либо отсортировать каждый и выбирать по паре с максимальным рейтингом (даже если у Ж рейтинг в 3 раза ниже/выше чем у М. все одно по паре).
Johnmen (2005-07-25 10:08:00) [9]>Nikolay M. © (25.07.05 09:56) [20]
Будет сортировать. Так, как автору и надо, сначала девочки, потом мальчики. Если есть желание не уступать девочкам, то существует ASCENDING/DESCENDING.
На этом можно поставить точку.
Nikolay M. (2005-07-25 09:56:00) [10]
> Deniz © (25.07.05 06:35) [18]
> Johnmen © (25.07.05 09:15) [19]
Вроде выше уже выяснили ( :о) ), что таким образом будет сортироваться результирующий набор данных, а не каждый из двух запросов по отдельности. Опять все сначала?
Johnmen (2005-07-25 09:15:00) [11]Самый верный и простой ответ Deniz © (25.07.05 06:35) [18].
А ещё интересно, что такое клёна, в смысле CLENA ?
И что такое POL ?
Deniz (2005-07-25 06:35:00) [12]А чем вам ответ Anatoly Podgoretsky © (23.07.05 12:57) [8] не нравится, или никак попробовать не получается?
select first 2 POL_CLENA, RAITING, ... from TABLICA where POL_CLENA='m'
union
select first 2 POL_CLENA, RAITING, ... from TABLICA where POL_CLENA='f'
ORDER BY 1, 2 desc, ...
Nikolay M. (2005-07-23 19:39:00) [13]Пыж. Сортировку, я еще подозреваю, надо все-таки DESC указать?
serguncho (2005-07-23 19:13:00) [14]> КОнечно по алфавиту
Что по алфавиту? Ф? И? О? И почему "конечно"?
------
В запарке некорректно отписался - по Имени М иди Ж, но это уже понятно, что вторым полем упорядочивания ставить.
serguncho (2005-07-23 19:11:00) [15]Nikolay M. © (23.07.05 19:05) [14]
----------
Шикарно. Огромное спасибо за разрешение проблемы.
Nikolay M. (2005-07-23 19:05:00) [16]
> serguncho © (23.07.05 16:56) [13]
> КОнечно по алфавиту
Что по алфавиту? Ф? И? О? И почему "конечно"?
А так ФБ поймет?
SELECT * FROM TABLICA WHERE ID IN (select TOP 2 ID from TABLICA where POL_CLENA='m' ORDER BY 7)
union
SELECT * FROM TABLICA WHERE ID IN (select TOP 2 ID from TABLICA where POL_CLENA='f' ORDER BY 7)
serguncho (2005-07-23 16:56:00) [17]Nikolay M. © (23.07.05 16:43) [12]
А как выбирать, если у всех рейтинг одинаковый?
----
Не бойтесь, пиписьками меряться не будут :-))
КОнечно по алфавиту, но не столько важно, т.к. я не могу даже обычного запроса сделать.
sniknik © (23.07.05 15:24) [10]
и сказал поэтому предположительно, попробовать, был бы аксесс сказал бы точнее ;о)) там можно так
SELECT * FROM (select TOP 2 * from TABLICA where POL_CLENA='m' ORDER BY 7)
union
SELECT * FROM (select TOP 2 * from TABLICA where POL_CLENA='f' ORDER BY 7)
----
Не работает. Как я понял Файрберд не работает с вложенными запросами. Если кто знает, как работать - подскажите. Т.к. вл. запросы точно бы проблему решили
Nikolay M. (2005-07-23 16:43:00) [18]
> serguncho ©
А как выбирать, если у всех рейтинг одинаковый?
Anatoly Podgoretsky (2005-07-23 15:31:00) [19]sniknik © (23.07.05 15:24) [10]
А я именно потому и подчеркнул, ANSI, поскольку тоже не хзнаю насколько он ANSI.
Ну а по поводу применения к результату, так логично же :-)
Порядок применяется к выдаваемому набору иначе не порядок.
По вопросу видно, что надо два М и два Ж и далее по рейтингу.
Большего он не сказал, а то есть еще и более хитрые методы.
sniknik (2005-07-23 15:24:00) [20]Anatoly Podgoretsky © (23.07.05 12:58) [9]
это я знаю (так сказать смутно догадываюсь что ограничения какието есть ;о)))
но кто сказал что файрбирд это чистый ANSI SQL? (возможно конечно, я с ним не так часто общаюсь... не в курсе тонкостей)
может и позволяет... почему не проверить.
и сказал поэтому предположительно, попробовать, был бы аксесс сказал бы точнее ;о)) там можно так
SELECT * FROM (select TOP 2 * from TABLICA where POL_CLENA='m' ORDER BY 7)
union
SELECT * FROM (select TOP 2 * from TABLICA where POL_CLENA='f' ORDER BY 7)