tabla - Ordene por orden de valores en una cláusula de selección "in" en mysql
como hacer busqueda en php (4)
Estoy seleccionando un conjunto de registros de cuenta de una tabla grande (millones de filas) con valores de identificación enteros. 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".
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 por adelantado.
En realidad, esto es mejor:
SELECT * FROM your_table
WHERE id IN (5,2,6,8,12,1)
ORDER BY FIELD(id,5,2,6,8,12,1);
Aquí está la documentación de CAMPO:
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field
Si su consulta es de 60K, eso es una señal de que lo está haciendo de la manera incorrecta.
No hay otra manera de ordenar 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 quieres, pero deberías poner los valores en la cláusula IN en una tabla o tabla temporal y unirte 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.
Tu 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 esta fue su primera consulta
SELECT customer_id FROM customer WHERE customer_id BETWEEN 1 AND 100 ORDER BY last_name
Y esta fue tu segunda consulta
SELECT inventory_id FROM rental WHERE customer_id in (...the ordered list...)
Combinado 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
Un pequeño 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.