powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Сортировка по списку в IN()
11 сообщений из 11, страница 1 из 1
Сортировка по списку в IN()
    #39291993
coder234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Помогите, пожалуйста, решить вопрос с сортировкой.

Есть простой запрос (Postgresql 9.5):
Код: sql
1.
SELECT col1, col2, col3 FROM table WHERE col1 IN ($arg_str)


Вместо $arg_str скрипт PHP подставляет список переменных параметров - $1,$2,$3... Сами параметры передаются отдельно (pg_query_params(), результат возвращается ассоц. массивом - pg_fetch_assoc()).

Ни кол-во параметров, ни их конкретные значения заранее неизвестны. Известно только, что они из одного столбца (первичный ключ).
Нужно получить результат в том же порядке, в котором перечислены параметры в IN($1,$2,$3...).
Покопал мануал ORDER BY, погуглил, здесь порыл немного - пока безрезультатно.

Может есть спец. функции, хитрости формата запроса или вообще для получения этого результата при таких вводных можно использовать др. запрос? Буду благодарен за подсказку (сам только начал осваиваться в Постгресе)
...
Рейтинг: 0 / 0
Сортировка по списку в IN()
    #39291996
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
передавай массив.
...
Рейтинг: 0 / 0
Сортировка по списку в IN()
    #39292000
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выполнение динамически формируемых команд] https://postgrespro.ru/docs/postgrespro/9.5/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN
...
Рейтинг: 0 / 0
Сортировка по списку в IN()
    #39292025
coder234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
p2., не понял, что - куда - как передавать массивом... Можно чуть подробнее?

Legushka, тоже не понял, как это может помочь решить задачу сортировки...

P.S. Новичок я. Пожалуйста, поясняйте идею в двух словах :))
...
Рейтинг: 0 / 0
Сортировка по списку в IN()
    #39292058
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coder234,

Допустим, у вас есть список:
Код: sql
1.
$arg_str="3,12,5,9,23,8";


Если его формить как массив, то можно его потом развернуть с сохранением индексов:
Код: sql
1.
SELECT * FROM unnest('{3,12,5,9,23,8}'::int[]) WITH ORDINALITY o(num,ord);


И первоначальный запрос переделать в что-то такое:
Код: sql
1.
2.
3.
4.
SELECT s.col1, s.col2, s.col3
  FROM unnest('{3,12,5,9,23,8}'::int[]) WITH ORDINALITY o(num,ord)
  JOIN tab s ON s.col1=o.num
 ORDER BY o.ord;
...
Рейтинг: 0 / 0
Сортировка по списку в IN()
    #39292145
coder234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorovcoder234,

Допустим, у вас есть список:
Код: sql
1.
$arg_str="3,12,5,9,23,8";


Если его формить как массив, то можно его потом развернуть с сохранением индексов:
Код: sql
1.
SELECT * FROM unnest('{3,12,5,9,23,8}'::int[]) WITH ORDINALITY o(num,ord);


И первоначальный запрос переделать в что-то такое:
Код: sql
1.
2.
3.
4.
SELECT s.col1, s.col2, s.col3
  FROM unnest('{3,12,5,9,23,8}'::int[]) WITH ORDINALITY o(num,ord)
  JOIN tab s ON s.col1=o.num
 ORDER BY o.ord;



Спасибо за объяснение! Я пока решил эту задачу на стороне скрипта (пересортировав массив результатов по массиву параметров), вроде во времени выполнения особо не потерял. Как-то все сложно здесь :)), в MySQL вроде существуют спец.функции аккурат для данного случая.
...
Рейтинг: 0 / 0
Сортировка по списку в IN()
    #39292175
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
где-то была статья как раз на эту тему, там сравнивались разные варианты с values + join, order by case, unnest + row_number. но никак не могу найти ссылку.
но эти варианты для старых версий актуальны, если 9.4+ то стоит использовать unnest with ordinality, как выше в примере.
...
Рейтинг: 0 / 0
Сортировка по списку в IN()
    #39292246
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coder234ла-ла-лаКак-то все сложно здесь :)), в MySQL вроде существуют спец.функции аккурат для данного случая.
Конструкция `WITH ORDINALITY` является частью SQL стандарта, вы можете ожидать аналогичный функционал в других СУБД, которые поддерживают стандарт.

Так что всё сложно в MySQL, ага...
...
Рейтинг: 0 / 0
Сортировка по списку в IN()
    #39323025
coder234
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если передавать конкретные аргументы, типа $arg_str="3,12,5,9,23,8";
то SELECT * FROM unnest('{3,12,5,9,23,8}'::int[]) WITH ORDINALITY o(num,ord); работает.

А если передавать параметры аргументов (из php-функции pg_query_params() - словом, как было сказано в 1 посте) - $arg_str="$1,$2,$3,$4,$5,$6"; то

то SELECT * FROM unnest('{$arg_str}'::int[]) WITH ORDINALITY o(num,ord); Не работает...
...
Рейтинг: 0 / 0
Сортировка по списку в IN()
    #39323045
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coder234Не работает...Незнание sql не противоречит незнанию php. С этим в другой форум.
...
Рейтинг: 0 / 0
Сортировка по списку в IN()
    #39323221
СергейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот пример запроса без использования массивов.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
# select * from xtemp;
 col1 | col2 
------+------
    1 | x
    2 | y
    3 | z
    4 | a
    5 | b
(5 rows)




Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
# with x0 as (values (1),(3),(2)), 
y as (select column1, row_number() over () from x0) 
select x.* from xtemp as x, y where y.column1=x.col1 order by y.row_number;
 col1 | col2 

------+------
    1 | x
    3 | z
    2 | y
(3 rows)



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


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