2010-02-02 11 views
23

Estoy seleccionando un conjunto de registros de cuenta de una tabla grande (millones de filas) con valores enteros de identificación. Como básico de una consulta como se obtiene, en cierto sentido. Lo que estoy haciendo nosotros es construir una gran lista separada por comas, y pasar eso a la consulta como una cláusula "in". En este momento, el resultado es completamente desordenado. Lo que me gustaría hacer es volver a obtener los resultados en el orden de los valores en la cláusula "in".Ordenar por orden de valores en una cláusula de selección "in" en mysql

Supongo que en su lugar tendré que crear una tabla temporal y hacer una combinación en su lugar, lo cual me gustaría evitar, pero es posible que no pueda.

¿Pensamientos? El tamaño de la consulta en este momento está limitado a aproximadamente 60k cada uno, ya que estamos tratando de limitar el tamaño de salida, pero podría ser arbitrariamente grande, lo que podría descartar una consulta "in" de todos modos desde un punto de vista práctico, si no un uno físico.

Gracias de antemano.

+0

similares a http://stackoverflow.com/questions/1869063/customised-ordering-in- sql –

Respuesta

0

Si su consulta es de 60K, es una señal de que lo está haciendo de la manera incorrecta.

No hay otra manera de pedir el conjunto de resultados que utilizando una cláusula ORDER BY. Podría tener una cláusula CASE complicada en su orden al enumerar todos los elementos en su cláusula IN nuevamente, pero luego su consulta probablemente sería 120K.

Sé que no desea, pero debe poner los valores en la cláusula IN en una tabla o una tabla temporal y unirse a ella. También puede incluir una columna SortOrder en la tabla temporal, y ordenar por eso. Bases de datos como join. Hacerlo de esta manera ayudará a que su consulta funcione bien.

0

La primera consulta seguramente usa una cláusula order by. Por lo tanto, puede hacer una combinación y usar la misma orden por cláusula.

Por ejemplo, si se trataba de su primera consulta

 
SELECT customer_id 
    FROM customer 
WHERE customer_id BETWEEN 1 AND 100 
ORDER 
    BY last_name 

y esta fue su segunda consulta

 
SELECT inventory_id 
    FROM rental 
WHERE customer_id in (...the ordered list...) 

combinada sería

 
SELECT r.inventory_id 
    FROM rental r 
INNER 
    JOIN customer c 
    ON r.customer_id = c.customer_id  
WHERE c.customer_id BETWEEN 1 AND 100 
ORDER 
    BY c.last_name 
4

Un poco de un truco .. ..

SELECT * FROM your_table 
WHERE id IN (5,2,6,8,12,1) 
ORDER BY FIND_IN_SET(id,'5,2,6,8,12,1') DESC; 

tenga en cuenta que la lista de ID en find_in_set es una cadena, por lo que se cita. También tenga en cuenta que sin DESC, los resultados se devuelven en orden inverso a lo especificado en la lista.

Cuestiones relacionadas