with tutorial framework español djangoproject desde con cero applications sql arrays postgresql join

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.


select distinct on (some_chosen_data_in_order.id) some_chosen_data_in_order.*, array_to_json( array_agg(row_to_json( items)) over ( partition by some_chosen_data_in_order.id )) from some_chosen_data_in_order left join items on items.id = any (some_chosen_data_in_order.id_items)