Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> UNION и сортировка 
V
    Опции темы
savmp
Дата 2.2.2012, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 260
Регистрация: 27.7.2009
Где: Геленджик

Репутация: -2
Всего: -16



Есть запрос... работает всё нормально, НО не так как нужно!


SELECT * FROM TABLE WHERE CALL_TARIFF = 'VIP' OR CALL_TARIFF = 'ECONOM'

UNION

SELECT * FROM TABLE WHERE CALL_TARIFF = 'FREE' ORDER BY RAND ()



Запрос вытягивает сначала строки с параметром тарифа VIP или ECONOM
а затем UNION
вытягивает строки с параметром тарифа FREE

если я пишу в конце ORDER BY RAND () то всё перемешивается как каша получается...


А нужно, что бы сначало выводились перемешанные между собой тарифы VIP и ECONOM
а уж потом в конце выводились перемешанные между собой тариф FREE

Помогите!
PM MAIL ICQ   Вверх
tzirechnoy
Дата 2.2.2012, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



Цитата
 RAND ()


А Вы так не делайте. Вообще, в GROUP BY/ORDER BY не следует использовать нечистых функцый. А в WHERE -- лучшэ поостеречься. Нужэн random -- возьмите какой-нибудь хэш от primary key. Нужэн каждый раз разный рандом -- заведите вне SQL какую-нибудь переменную в качестве рандома, и используйте её в качестве соли.

Код

ORDER BY (call_tariff='VIP' or call_tariff='ECONOM') DESC,
         md5('SALT' || call_name || call_id);


(пример для постгреса, где md5 есть в комплекте, call_name и call_id -- условно primary key из Вашэй таблицы).


PM MAIL   Вверх
Свят86
Дата 5.4.2012, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 25.12.2008

Репутация: нет
Всего: нет



тоже интересует данный вопрос! сортировка под запросов по отдельности
есть запрос на выборку данных вида:
select 1.1, 2.1, 1.2 from 2 inner join 1 on 2.2=1.1 where (тут сложное условие на отбор)  union all select 1.1, 2.1, 1.2 from 2 inner join 1 on 2.2=1.1 where (тут тоже сложное условие на отбор)

1 и 2 это номера таблиц, а подпункты номера полей.

то есть у меня получается две объединенные выборки и мне нужно сделать сортировку каждой части по полю 1.1 очень важно чтоб в таблице у меня шла сначала первая (отсортированная по полю 1.1 ) часть, а потом следом вторая (также отсортированная по полю 1.1) часть!

вставка select 1.1, 2.1, 1.2 from 2 inner join 1 on 2.2=1.1 where (тут сложное условие на отбор) order by 1.1  union all select 1.1, 2.1, 1.2 from 2 inner join 1 on 2.2=1.1 where (тут тоже сложное условие на отбор)
результата не дало, а вставка order by 1.1 в конец, соответственно сортирует всю выборку...

P.S. в поле 1.2 у меня стоят даты,и в первой части даты за последние пол года, а во второй более поздние, если это как-то поможет...

Это сообщение отредактировал(а) Свят86 - 5.4.2012, 16:40
PM MAIL   Вверх
Zloxa
Дата 5.4.2012, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Свят86, подмешайте в результат вывода суррогатные значения, а затем сортируйтесь по ним.
Код

select *
from (
  select 1 ord_num, val1 ... from ....
  union all 
  select 2 ord_num, val1 ... from ....
)
order by ord_num, val1 



Это сообщение отредактировал(а) Zloxa - 5.4.2012, 16:56


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Свят86
Дата 5.4.2012, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 25.12.2008

Репутация: нет
Всего: нет



спасибо большое! smile задача решена. у меня запрос этот в Access так что в добавку между 1 и ord_num и 2 и ord_num нужно AS запихнуть! smile
PM MAIL   Вверх
Свят86
Дата 6.4.2012, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 25.12.2008

Репутация: нет
Всего: нет



да... выявилась еще одна проблема в моем этом запросе...  сложное условие на отбор выглядит так:

(((1.2) In (Select max(1.2) from 1 Group By 1.1) and (1.2)>Now()-150)))  ну а вторая часть (1.2)<=Now()-150   

 как я уже писал в поле 1.2 у меня дата  и если в таблице 1 самая свежая дата по полю 1.1 встречается два раза, то и запрос выкидывает обе записи! тоесть он не может он отбирая максимальные записи, берет их обе! как эту беду отсечь?  

P.S. запрос в Access.
PM MAIL   Вверх
Akina
Дата 6.4.2012, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Вместо 
Код

Select max(1.2) from 1 Group By 1.1

(фрагмент, кстати, выглядит бредово - нахрена тут группировка?) используйте
Код

Select first(1.2) from 1 order by (1.2) desc



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Свят86
Дата 6.4.2012, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 25.12.2008

Репутация: нет
Всего: нет



спасибо за оперативный ответ, но first  все равно почему-то дает оба варианта...

а вариант с order by  пишет что попытка выполнить запрос, который не включает 1.2 как часть агрегатной функции...  smile 
PM MAIL   Вверх
Akina
Дата 6.4.2012, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Свят86 @  6.4.2012,  10:45 Найти цитируемый пост)
first  все равно почему-то дает оба варианта...

Вы хотите сказать, что подзапрос 
Код

Select first(1.2) from 1 order by (1.2) desc

возвращает две записи??? не верю...
Хотя по поводу его использования я неправ - сортировка-то будет выполняться после агрегатки...

Давайте так - всё-таки дайте полный текст запроса, отформатированный по-человечески и обрамлённый соотв. тегом. А то складывать ваши лапшеобразные ошмётки в что-то цельное - затруднительно.




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Свят86
Дата 6.4.2012, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 25.12.2008

Репутация: нет
Всего: нет



я начал догонять! что max что first возвращают одну дату! самую последнюю! а у меня же получается 
Код

Select 1 AS ord_num, 1.1, 2.1, 1.2 from 2 Inner Join 1 On 2.2=1.1 Where ((1.2) In (Select max(1.2) from 1 Group By 1.1) And (1.2)>Now()-150))
Union All 
Select 2 AS ord_num, 1.1, 2.1, 1.2 from 2 Inner Join 1 On 2.2=1.1 Where ((1.2) In (Select max(1.2) from 1 Group By 1.1) And (1.2)<=Now()-150))
Order by ord_num, 2


так вот In возвращает одну отобранную дату, а таких же дат относящихся к полю 1.1 получается две! вот запрос  две записи и отбирает!
как оставить одну? без разницы какую...

Это сообщение отредактировал(а) Свят86 - 6.4.2012, 10:41
PM MAIL   Вверх
Akina
Дата 6.4.2012, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



1)
Код

Select max(1.2) from 1 Group By 1.1
по определению вернёт тебе набор записей. Тебе нужно выбрать одну запись? описывай вменяемо, какую именно.

2) UNION тут не нужен, равно как и синтетическое поле. Вполне достаточно (пока с кривым подзапросом)
Код

Select 1.1, 2.1, 1.2 
from 2 
Inner Join 1 
On 2.2=1.1 
Where 1.2 In 
(  Select max(1.2)
   from 1
   Group By 1.1
) 
Order by IIF(1.2<=Now()-150,1,0), 2




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Свят86
Дата 6.4.2012, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 25.12.2008

Репутация: нет
Всего: нет



Спасибо за Ваше решение! smile но проблема пока остается! попытаюсь ее внятно изложить!
в поле 1.2 у меня даты, по которым идет группировка, сначала идут отсортированные записи у которых дата >Now()-150 а потом остальные тоже отсортированные.
все работает хорошо, но когда к записи 1.1 (к ней идет много дат) самая свежая дата не одна, а две или три (12.01.12 еще запись тоже 12.01.12) то в результирующем запросе они обе отображаются...
а мне нужно чтоб она была одна и неважно какая, потому как у меня получается 

поле 1.1    поле 2.1   поле 1.2
а                   1           10.03.12
б                  15          12.01.12
б                  15          12.01.12       эта запись лишняя! и получилась из за того что самая последняя дата по ней в таблице 1 встречается два раза(было два обращения в эту дату)
в                   21         15.03.12
аг                 18          10.03.11
бф                14          12.05.11
PM MAIL   Вверх
Akina
Дата 6.4.2012, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



И всего-то? добавьте distinct.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Свят86
Дата 6.4.2012, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 25.12.2008

Репутация: нет
Всего: нет



спасибо большое! smile все заработало, правда пришлось откатиться к своему варианту с UNION ALL, так как DISTINCT конфликтует с Order by IIF(1.2<=Now()-150,1,0), 2


спасибо большое!  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0564 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.