Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > Сортировка по полю в котором найдено ключевое слов


Автор: Maksym 27.3.2006, 10:44
Вот такой простой запрос:
Код

SELECT field3 FROM table1 WHERE (field1 LIKE %keyword%) OR (field2 LIKE %keyword%) ORDER BY field4

Необходимо чтобы в результирующей выборке сначала шли записи, в которых keyword обнаружился в field1, а после них записи для которых keyword попал в field2.
Как бы это сделать? smile

Автор: LSD 27.3.2006, 10:47
Через uninon:
Код
(SELECT field3 FROM table1 WHERE field1 LIKE %keyword% ORDER BY field4)
union
(SELECT field3 FROM table1 WHERE field2 LIKE %keyword% ORDER BY field4)

Автор: Maksym 27.3.2006, 11:26
LSD
Спасибо smile
А если какая нибудь запись будет удовлетворять обоим SELECTам - он вадь попадет в выборку дважды? или я ошибаюсь..

Автор: LSD 27.3.2006, 11:38
Да. В принципе можно включить туда дополнительное условие not (like...), но это не здорово с точки зрения производительности.

Автор: ТоляМБА 27.3.2006, 11:44
Если я не ошибаюсь, то в MS SQL Server 2000:
так попадут по одной записи на разные условия (если запись есть и по 1-му и по 2-му условию)
Код

Select *
from table1
where ...
union
Select *
from table1
where ...

а так попадут все записи с поторяющимися значениями по обоим условиям
Код

Select *
from table1
where ...
union ALL
Select *
from table1
where ...


(развница в запросах в слове ALL)

Автор: Maksym 27.3.2006, 12:21
Работаю в postgresql

Автор: LSD 27.3.2006, 13:26
Попробуй union distinct.

Автор: Maksym 6.4.2006, 11:12
SELECTы успешно выполняются, с помощью UNIONа объединяются, но итоговый набор данных перемешался все равно, отсортирован по первичному ключу, если не указано иное. smile

Автор: Maksym 6.4.2006, 11:48
Да, почитал документацию, на результат UNION накладывается общая сортировка. Получить результаты заросов последовательно - не получается.

Автор: chief39 6.4.2006, 15:58
Цитата(LSD @ 27.3.2006, 13:26 Найти цитируемый пост)
Попробуй union distinct.

Стоп... насколько знаю, distinct только для селекта, поскольку по умолчанию он гребёт всё.
А юнион дублирующиеся строки выбрасывает(дефолт). Ему насильно нао указывать ALL
Из-за этого стандарт SQL и попинывали.



Maksym, попробуй сиё:

Код


-- тестовая табличка
create table ttt(
    i integer,
    v varchar(50)
);

-- тестовые данные

insert into ttt(i,v) values(1,'t');
insert into ttt(i,v) values(2,'s');
insert into ttt(i,v) values(3,'a');
insert into ttt(i,v) values(4,'z');


-- убеждаемся что они есть
select * from ttt

-- собссно дабл селект с юнионом
-- выбрало пять строк(двойка попадает и в тот и тот запрос, all запрещает показать эти две записи как одну, сортирует по второму столбцу весь датасет)
select i,v
from ttt
where i>1
union all
select i,v
from ttt
where i<3
order by 2


-- то же самое, но без all двойка один раз попалась - четыре записи в результате на выводе
select i,v
from ttt
where i>1
union
select i,v
from ttt
where i<3
order by 2



Только что прогнал на оракле. Имхо - везде должно отработать - самый что ни на есть стд. скл. smile
Добавлено @ 16:06
Аааа... пардон, зачитался комментами - вопрос проглядел... smile стандартом Union так не сделаешь, делай так:

Код

select i,v,1
from ttt
where i>1
union
select i,v,2
from ttt
where i<3
order by 3 asc, 2 asc



Дополнительная колонка - для разделения записей по резалтсетам - в итоге её просто не отображай(не используй) ;)

Автор: Maksym 13.4.2006, 12:27
chief39
не пойму чтото... ввести дополнительную колонку?..

Автор: batigoal 13.4.2006, 13:49
Цитата(Maksym @ 13.4.2006, 13:27 Найти цитируемый пост)
не пойму чтото... ввести дополнительную колонку?..

Да, но не в таблице, а в результате запроса. При обработке этого результата - игнорировать.

Автор: chief39 13.4.2006, 19:49
Цитата(Maksym @ 13.4.2006, 12:27 Найти цитируемый пост)
не пойму чтото... ввести дополнительную колонку?..

Это колонка времени запроса, а значения - константы. Ты можешь указывать конкретные поля из селектируемых таблиц или константы. В случае констант - они равны для любой строчки резалтсета. То есть
Код

select x, 1
from name_tab

даст
Код

Вася,    1
Петя,    1
Игорь,  1

В твоём случае - это пока единственное и совсем несложное решение твоего вопроса smile Уже готовое ;)


Автор: Maksym 18.4.2006, 14:35
chief39
Ну так проблема одинаковых записей не решается...  За счет дополнительной виртуальной колонки строки с одинаковыми значениями теряют свою уникальность и UNION их не ообъединяет в одну... 

Автор: chief39 18.4.2006, 15:13
Цитата(Maksym @  18.4.2006,  14:35 Найти цитируемый пост)
chief39
Ну так проблема одинаковых записей не решается...  За счет дополнительной виртуальной колонки строки с одинаковыми значениями теряют свою уникальность и UNION их не ообъединяет в одну...  

Дык... тогда во втором запросе сделай подзапрос not in (первый запрос)
Выберет первый. Потом второй, исключая записи, которые УЖЕ были в первом.
Так будет помедленнее но.. под все твои требования вроде подгоняется ;) 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)