Mantener orden en una cláusula WHERE IN en mi SQL
Pregunta
Me postulo la siguiente consulta SQL:
SELECT * FROM cms_albums WHERE id IN (SELECT album_id FROM cms_albums_collections WHERE collection_id = 1 ORDER BY position ASC)
Ahora, supongamos que la consulta interna
SELECT album_id FROM cms_albums_collections WHERE collection_id = 1 ORDER BY position ASC
devuelve el siguiente:
album_id
"4"
"2"
Este es el orden que yo quiero. Sin embargo, la consulta general volverá:
id name
"2" "Second album"
"4" "First album"
Estoy suponiendo que esto se debe a que las entradas son en este orden en la tabla '' cms_albums. ¿Hay alguna manera puedo obtener mi resultado global en el orden dado por la consulta interna?
Gracias
Solución
Trate de esta variación:
SELECT DISTINCT c.*
FROM cms_albums c
JOIN cms_albums_collections cc
ON c.id = cc.album_id
WHERE cc.collection_id = 1
ORDER BY
cc.position ASC
El orden de los elementos de una lista IN se pierde, en cambio formar una unión, a continuación, se puede aplicar el pedido que quería.
Otros consejos
No estoy de acuerdo con la afirmación de que los resultados que fueron devueltos eran necesariamente el orden de la tabla o el orden en que las filas se insertan en la tabla. Si el plan de ejecución que fue utilizado por el servidor utiliza un índice no agrupado o un conjunto en memoria de datos, entonces el orden de clasificación no refleja necesariamente el orden de la tabla real o el orden en que se han insertado los datos. Una vez dicho esto, hay algunas opciones que pueden lograr su objetivo:
- En lugar de utilizar una declaración en la que podría utilizar un JOIN y luego ordenar por el índice agrupado de la tabla secundaria.
- Modificado verison de 1. Si la consulta sub devuelve más de una fila por albumn ID luego agregar los datos ya sea en el CTE o la consulta sub. Usted todavía tendrá que resolver en el índice agrupado.