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

¿Fue útil?

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:

  1. 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.
  2. 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.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top