tutorial - PostgreSQL JOIN con tipo de matriz con orden de elementos de matriz, ¿cómo implementar?
tutorial django (4)
Tengo dos tablas en la base de datos:
CREATE TABLE items(
id SERIAL PRIMARY KEY,
... some other fields
);
Esta tabla contiene la fila de datos con ID única.
CREATE TABLE some_chosen_data_in_order(
id SERIAL PRIMARY KEY,
id_items INTEGER[],
);
Esta tabla contiene el campo de tipo de matriz. Cada fila contiene valores de ID de items
tabla en un orden específico. Por ejemplo: {2,4,233,5}
.
Ahora, quiero obtener datos de los items
tabla para la fila elegida de la tabla some_chosen_data_in_order
con orden para los elementos en el tipo de matriz.
Mi intento fue ÚNETE:
SELECT I.* FROM items AS I
JOIN some_chosen_data_in_order AS S ON I.id = ANY(S.id_items) WHERE S.id = ?
El segundo intento fue una subconsulta como:
SELECT I.* FROM items AS I
WHERE I.id = ANY
(ARRAY[SELECT S.id_items FROM some_chosen_data_in_order WHERE id = ?])
Pero ninguno de ellos mantiene las ID en el mismo orden que en el campo de matriz. ¿Podría ayudarme, cómo obtener datos de la tabla de items
con el orden de los ID de some_chosen_data_in_order
tabla some_chosen_data_in_order
para una fila específica?
Probablemente normalizar tu mesa sería el mejor consejo que puedo darte.
El módulo contrib int_array tiene una función idx que le dará la posición del índice int en la matriz. También hay una función idx en el wiki de fragmentos que funciona para la matriz de cualquier tipo de datos.
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 = ?])
SELECT t.*
FROM unnest(ARRAY[1,2,3,2,3,5]) item_id
LEFT JOIN items t on t.id=item_id
La consulta anterior selecciona elementos de la tabla de items
con identificadores: 1,2,3,2,3,5 en ese orden.