У меня есть две таблицы в базе данных:
CREATE TABLE items(
id SERIAL PRIMARY KEY,
... some other fields
);
Эта таблица содержит, прибывают строка данных с уникальным идентификатором.
CREATE TABLE some_chosen_data_in_order(
id SERIAL PRIMARY KEY,
id_items INTEGER[],
);
Эта таблица содержит поле типа массива. Каждая строка содержит значения идентификаторов от таблицы items
в определенном порядке. Например: {2,4,233,5}
.
Теперь, я хочу получить данные из таблицы items
для выбранной строки от таблицы some_chosen_data_in_order
с порядком на элементы в типе массива.
Моя попытка была СОЕДИНЕНИЕМ:
SELECT I.* FROM items AS I
JOIN some_chosen_data_in_order AS S ON I.id = ANY(S.id_items) WHERE S.id = ?
Вторая попытка была подзапросом как:
SELECT I.* FROM items AS I
WHERE I.id = ANY
(ARRAY[SELECT S.id_items FROM some_chosen_data_in_order WHERE id = ?])
Но ни один из них не сохраняет идентификаторы в том же порядке как в поле массива. Вы могли помочь мне, как получить данные из items
таблица с соответствует порядку идентификаторов массива от some_chosen_data_in_order
таблица для определенной строки?
Возможно, нормализация вашей таблицы будет лучшим советом, который я могу вам дать.
Модуль int_array contrib имеет функцию idx, которая даст вам позицию индекса int в массиве. Также есть функция idx в snippets wiki, которая работает для массивов любых типов данных.
SELECT i.*, idx(id_items, i.id) AS idx
FROM some_chosen_data_in_order s
JOIN items i ON i.id = ANY(s.id_items)
ORDER BY idx(id_items, i.id)