2010-12-01 24 views
8

¿Es posible especificar un orden arbitrario para una instrucción MySQL SELECT? Por ejemplo,MySQL especifica orden arbitraria por id

SELECT * FROM table_name WHERE id IN (1, 3, 2, 9, 7) ORDER BY (1, 3, 2, 9, 7); 

El orden de los números que se indican directamente después de IN no parecen tener importancia.

+0

@MattDiPasquale - Usted ya tiene el pedido en '1,3,2,9,7', simplemente cargue los resultados para' 1, 2, 3, 9, 7', y configúrelo según el orden de '1 , 3,2,9,7'. Cualquier especificar el lenguaje de programación? – ajreal

+0

Estoy usando WordPress, PHP. Me gustaría hacerlo todo en MySQL para que no tenga que hacer ningún procesamiento en PHP. – ma11hew28

+0

@MattDiPasquale - 'find_in_set' no es rápido ni está muy optimizado. Hacerlo en PHP es más rápido y optimizado. – ajreal

Respuesta

11

función FIND_IN_SET hará el truco

SELECT * FROM table_name WHERE id IN (1, 3, 2, 9, 7) ORDER BY FIND_IN_SET(id, '1,3,2,9,7'); 

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

EDIT: Tenga en cuenta la falta de espacios en el argumento de cadena de la función FIND_IN_SET.

+0

¿Lo has probado? Cuando lo probé, obtuve el pedido: 2, 3, 7, 9, 1, que es incorrecto – ma11hew28

+0

eliminar los espacios –

+0

¡Oh, qué bien! Gracias, funcionó! – ma11hew28

0

Respuesta fácil:

Instrumento sus datos con otro campo "ordenamiento" int y luego ordenar por ese campo. Esto debería ser todo lo que sea necesario la mayor parte del tiempo. He hecho esto con éxito donde los clientes pueden incluir ciertos productos en una lista destacada, etc. aplicando valores bajos como -1 o -99 en el campo de ordenamiento.

respuesta compleja:

Esto se aplicaría si se quería normalizar ese ordenamiento, y si usted tenía quizá otro campo como el segundo factor en el orden, que ya está en la mesa principal. Esto también ayudaría si tiene otra información asociada con cada punto de pedido, como una nota. O bien, si muchas tablas van a implementar este orden arbitrario, y desea orquestar/modificar ese orden desde un solo lugar.

Lo que se hace es colocar la orden "arbitraria" en una tabla puede unirse y luego ordenar por ese campo:

SELECT t.*, o.ordering 
FROM table_name AS t 
LEFT JOIN table_name_ordering AS o ON t.ordering_id = o.id 
ORDER BY o.ordering, t.other_field 
4

Salida de MySQL ORDER BY FIELD. Creo que hará exactamente lo que quieras.

+0

¿Es esto más rápido que FIND_IN_SET? Apuesto a que sí, ya que no tiene una sintaxis de análisis de cadenas como FIND_IN_SET. La sintaxis que creo es: 'ORDER BY FIELD (id, 1,3,2,9,7)' – Ciantic