データベースに2つのテーブルがあります。
CREATE TABLE items(
id SERIAL PRIMARY KEY,
... some other fields
);
このテーブルには、一意のIDを持つ来たデータ行が含まれます。
CREATE TABLE some_chosen_data_in_order(
id SERIAL PRIMARY KEY,
id_items INTEGER[],
);
このテーブルには、配列タイプのフィールドが含まれています。各行には、特定の順序でテーブルitems
からのIDの値が含まれます。例:{2,4,233,5}
。
ここで、テーブルsome_chosen_data_in_order
から選択した行の配列items
から配列型の要素の順序でデータを取得したいと思います。
私の試みは参加しました:
SELECT I.* FROM items AS I
JOIN some_chosen_data_in_order AS S ON I.id = ANY(S.id_items) WHERE S.id = ?
2番目の試みは次のようなサブクエリでした。
SELECT I.* FROM items AS I
WHERE I.id = ANY
(ARRAY[SELECT S.id_items FROM some_chosen_data_in_order WHERE id = ?])
ただし、配列フィールドと同じ順序でIDを保持するものはありません。特定の行のsome_chosen_data_in_order
テーブルの配列IDの順序に対応するitems
テーブルからデータを取得する方法を教えてください。
SELECT t.*
FROM unnest(ARRAY[1,2,3,2,3,5]) item_id
LEFT JOIN items t on t.id=item_id
上記のクエリは、IDが1,2,3,2,3,5の順序でitems
テーブルからアイテムを選択します。
おそらくあなたのテーブルを正規化することは、私があなたに与えることができる最高のアドバイスでしょう。
Int_array contribモジュールには、配列内のintのインデックス位置を提供するidx関数があります。また、 snippets wiki にはidx関数があり、あらゆるデータ型の配列に対して機能します。
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)
SELECT I.* FROM items AS I
WHERE I.id IN (SELECT UNNEST(id_items) FROM some_chosen_data_in_order
(ARRAY[SELECT S.id_items FROM some_chosen_data_in_order WHERE id = ?])