сортировка в зависимости от совпавшего усоловия

fog

Рыцарь Джедай
сортировка в зависимости от совпавшего усоловия

Есть запрос, делающий выборку, по двум критериям, т.е. должно совпасть одно поле со значением и возможно ещё одно.

Выглядит запрос примерно так

Код:
select 
	t.*, m.*, ty.*
from 
	tr_transport t 
	left join tr_manager m using(manager_id) 
	left join tr_type ty on (ty.type_id = t.type_id) 
where 
	(location_id_from = 142 or substring("-142-", location_path_from))
	and (location_id_to = 148 or substring("-148-", location_path_to))
Так вот, могут найтись записи где совпадёт "location_id_to = 142", а могут где совпадт substring("-142-", location_path_to).

Как бы отсортировать записи так, чтобы сначала шли записи с первым совпадением, а после них со вторым?

Усложнается тем, что, что тут две проверки. Тоесть, сначала должны и ти где в двух условиях совпели первые части (location_id_from = 142 и location_id_to = 148), потом записи где совпала одна часть, потом где совпали только вторые части (substring("-142-", location_path_from) и substring("-148-", location_path_to)).
 

vadim

Guest
fog
Сделайте три селекта и соедините их с помощью UNION в нужном порядке
 

fog

Рыцарь Джедай
Точно! Я тоже об этом подумал изначально, но почему-то не воспринял идею всерьёз, почему-то хотелось просто условием сделать... =)

Спасибо.
 

Serg Karpenko

Новичок
order by
case
when (location_id_from = 142 and substring("-142-", location_path_from)) then 2
when (location_id_from = 142 or substring("-142-", location_path_from)) then 1
else 0
end
 

fog

Рыцарь Джедай
Serg Karpenko
Спасибо, это хороший вариант =)

Правда, у меня и тут трудность возникла.

совпавшие записи сгруппируются по типу совпадения, но внутри этого совпадения нужно сделать ещё сортировку по времени их добавления в базу.

приведу пример, более упрощённый чем выше

есть таблица с данными, только ID

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

делаем запрос

Код:
select * from table
order by
  case
    when (id >= 4 and id <=6) then 1
    when (id >= 9 and id <=11) then 2
  else 3
end
Выборка произведётся, создадутся как бы три группы данных, совпавших с условиями. Эти группы можно сортировать ASC или DESC, но внутри групп записи будут без сортировки, тоесть результат может выглядеть примерно так

4
5
6
11
10
9
1
2
3
7
8
12
13
14
15

Хотелось бы получить список отсортированный внутри групп по идентификатору, вот так

6
5
4
11
10
9
15
14
13
12
8
7
3
2
1

Возможно ли это?
 

fog

Рыцарь Джедай
Serg Karpenko
Хм, и действительно.... ведь пробовал же, и что-то я видимо не так написал, что сортировка по case проигнорировалась, и отсортировало только во второму полю... сейчас попробовал ещё раз - работает... =)

Спасибо!
 
Сверху