powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сортировка с исключением
14 сообщений из 14, страница 1 из 1
Сортировка с исключением
    #34227465
sourcer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как можно сделать следующие на уровне базы?:


Есть таблица
id
name

ну жно сделать SELECT * FROM table ORDER BY id
но так чтобы id с номерами 3,6,1,4 стояли первыми в том порядке котором я написал, а потом шли все остальные...

двумя запросами сделать легко, сначало выбераем id IN (3,6,1,4), а потоом id NOT IN (3,6,1,4)

А как это можно сделать одим запросом?
...
Рейтинг: 0 / 0
Сортировка с исключением
    #34227471
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
SELECT * FROM table ORDER BY case when id in ( 1 , 3 , 4 , 6 ) then  0  else id end
...
Рейтинг: 0 / 0
Сортировка с исключением
    #34227498
sourcer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо большое.
...
Рейтинг: 0 / 0
Сортировка с исключением
    #34227626
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sourcerчтобы id с номерами 3,6,1,4 стояли первыми в том порядке котором я написал

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
select some_records.some_value
from
  (
    select '00'::numeric as some_value union
    select '01'::numeric as some_value union
    select '02'::numeric as some_value union
    select '03'::numeric as some_value union
    select '04'::numeric as some_value union
    select '05'::numeric as some_value union
    select '06'::numeric as some_value union
    select '07'::numeric as some_value union
    select '08'::numeric as some_value union
    select '09'::numeric as some_value
  )
  as some_records
order by

  ( some_records.some_value =  3  ) desc,
  ( some_records.some_value =  6  ) desc,
  ( some_records.some_value =  1  ) desc,
  ( some_records.some_value =  4  ) desc,

  some_records.some_value
...
Рейтинг: 0 / 0
Сортировка с исключением
    #34227871
sourcer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT * FROM table ORDER BY case when id in (1,3,4,6) then 0 else id end

этот метод хорош но он немного не корректно работает если ему дать
SELECT * FROM table ORDER BY case when id in (21,20,19,18) then 0 else id end
то он сортерует следующим образом 18,20,21,19 а потом вё остальное...
почему так непойму...

второй метод который предложили рабоатет но блин слишком грамостский у меня будут тысячи таких исколючений и запрос может стать очень большим да и к тому же у меня id BIGINT прописывать все значения в зарпосе глупо


Ктонибудь знает как поправить первый метод бы?
...
Рейтинг: 0 / 0
Сортировка с исключением
    #34227894
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделать вторую табличку с нужным порядком сортировки (id, orderseq)
...
Рейтинг: 0 / 0
Сортировка с исключением
    #34227907
sourcer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Табличку делать нельзя в том то идело что задача именно такая как я описал ничего прибавить не убавить нельзя
...
Рейтинг: 0 / 0
Сортировка с исключением
    #34227914
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sourcer Ктонибудь знает как поправить первый метод бы?а первого метода как бы и не было. Было направление. На котором вы б уперлись в необходимость еще и сортировать внутри исключения.
т.е. во что-то, вида 2-го способа.


если исключений много - заведите вспомогательную таблицу. скажем - re_collate и по ее полю, скажем re_order сортируйте (свернув с ней left join-ом свою) , а уж потом - по id.
...
Рейтинг: 0 / 0
Сортировка с исключением
    #34228380
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT * FROM table
 ORDER BY case when id =  3  then - 4 
               when id =  6  then - 3 
               when id =  1  then - 2 
               when id =  4  then - 1 
               else id
           end
...
Рейтинг: 0 / 0
Сортировка с исключением
    #34228634
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZemA
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT * FROM table
 ORDER BY case when id =  3  then - 4 
               when id =  6  then - 3 
               when id =  1  then - 2 
               when id =  4  then - 1 
               else id
           end

и нарваться на наличие в id в таблице отрицалова, всатвленного до кучи при вливе данных.
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT * FROM table
 ORDER BY  id <>  3  
               , id <>  6  
               , id <>  1  
               , id <>  4 
               , id
свободно от такой проблемы
(<>, как и DESC в исходном - только потому, что 't'>'f' ('true' > 'false') ), хотя я, к примеру привык к True<False
...
Рейтинг: 0 / 0
Сортировка с исключением
    #34228646
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но все равно будет
sourcer
...
слишком грамостский у меня будут тысячи таких исколючений и запрос может стать очень большим да и к тому же у меня id BIGINT прописывать все значения в зарпосе глупо
...
...
Рейтинг: 0 / 0
Сортировка с исключением
    #34228675
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st_sergно все равно будет
sourcer
...
слишком грамостский у меня будут тысячи таких исколючений и запрос может стать очень большим да и к тому же у меня id BIGINT прописывать все значения в зарпосе глупо
...
этто да. от этаго никуда не десца.



Наверно он свое сравнение написать хочет.
Я б правда просто ф-ю один раз написал от bigint. Если заведомо знаем, что порядок исключений раз и навсегда задан. А уж по ф-ии можно и индекс построить.
...
Рейтинг: 0 / 0
Сортировка с исключением
    #34228824
sourcer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
смотрие я сдела вспомогательную временную таблицу
CREATE TEMPORARY TABLE top (id bigint,count bigint);

потом делаю запрос
SELECT * FROM all LEFT JOIN top ON (all.id=top.id) ORDER BY top.count DESC

Налицо лефт джойн...
НО выходит следющие
вверх выводятся элементы у которых нет связей all.id<->top.id и за ними в отсортированном порядке уже те у которых есть связи.. как бы сделать чтобы сначало выводились те у которых связи есть а потом у кого нет и отсортированные были по DESC
?
...
Рейтинг: 0 / 0
Сортировка с исключением
    #34228859
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пишем функцию
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE FUNCTION my_order(id BIGING) RETURNS BIGING AS
$$
BEGIN
RETURN CASE 
               WHEN id =  3  then  1 
               WHEN id =  6  then  2 
               WHEN id =  1  then  3 
               WHEN id =  4  then  4 
               -- об этих значениях как-то вы забыли... ну да их можно куда угодно вставить
               WHEN id =  2  then  5 
               WHEN id =  5  then  6 
               ELSE id
               END;
END;
$$ LANGUAGE 'plpgsql' IMMUTABLE;

А затем сортируем по этой функции

Код: plaintext
1.
   SELECT * FROM Table ORDER BY my_order(id);

Если функция IMMUTABLE то по ней еще и индекс можно сделать.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сортировка с исключением
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]