2009-08-26 16 views
53

Tengo una matriz de PHP con números de ID en ella. Estos números ya están ordenados.ORDEN DE MySQL POR IN()

Ahora me gustaría obtener mi resultado a través del método IN(), para obtener todas las ID.

Sin embargo, estos ID deben solicitarse como en el método IN.

Por ejemplo:

IN(4,7,3,8,9) 

debe dar un resultado como:

4 - Article 4 
7 - Article 7 
3 - Article 3 
8 - Article 8 
9 - Article 9 

¿Alguna sugerencia? Tal vez hay una función para hacer esto?

Gracias!

+0

¿Cuáles son los otros datos asociados con esos números? Podría darnos una pista de por qué lo quieres en ese orden. – Randell

Respuesta

125

creo que puede estar buscando para la función FIELD - mientras que normalmente se considera como una función de cadena, que funciona bien para los números, también!

ORDER BY FIELD(field_name, 3,2,5,7,8,1) 
+1

Exactamente. Estaba buscando en el libro de recetas MySQL de Paul Dubois y lo encontré: SELECCIONE id, nombre FROM artículos DONDE id EN (7,4,21) PEDIDO POR CAMPO (id, 7,4,21) ¡Gracias! –

+0

Maldita sea, la gente es rápida. ;-) – deceze

+0

@Henk, feliz de haberte ayudado, pero una aceptación sin un voto ascendente es una ocurrencia muy peculiar en SO - ¿Por alguna razón no me has votado? -) –

-3

Solo tendrá que dar la orden correcta por declaración.

SELECT ID FROM myTable WHERE ID IN(1,2,3,4) ORDER BY ID 

¿Por qué quieres para obtener sus datos ordenados desordenada como en su ejemplo?

Si no le importa concatening consultas largas, trate de esa manera:

SELECT ID FROM myTable WHERE ID=1 
UNION 
SELECT ID FROM myTable WHERE ID=3 
UNION 
SELECT ID FROM myTable WHERE ID=2 
+0

Gracias. Pero esto no hará el truco: SELECCIONE id, nombre FROM artículos WHERE id IN (7,4,21) ORDER BY id Debe mostrar 7,4,21. Pero, en cambio, mostrará: 4,7,21 ... –

+2

La unión no * garantiza * la orden. – paxdiablo

+0

Correcto, por lo tanto, mi segundo tiro, dará la 'orden' deseada, pero no es la cosa más dulce. –

0

estándar SQL no proporciona una manera de hacer esto (MySQL puede, pero yo prefiero que son soluciones de proveedor neutral por lo que puede cambiar DBMS 'en cualquier momento).

Esto es algo que debe hacer en el postprocesamiento después de se devuelve el conjunto de resultados. SQL solo puede devolverlos en un orden especificado en la cláusula "ordenar por" (o en cualquier orden si no existe dicha cláusula).

La otra posibilidad (aunque no me gusta, tengo el honor de darle la opción) es hacer múltiples viajes a la base de datos, uno para cada ID, y procesarlos cuando ingresen:

select * from tbl where article_id = 4; 
// Process those. 
select * from tbl where article_id = 7; 
// Process those. 
: : : : : 
select * from tbl where article_id = 9; 
// Process those. 
+0

Puede hacerlo en SQL estándar usando 'CASE col WHEN * 1st-val * THEN 1 WHEN * 2nd-val * THEN 2 ... END' – derobert

+1

... ¡No es que yo recomiende tal cosa! – derobert

8

Usted podría utilizar FIELD():

ORDER BY FIELD(id, 3,2,5,7,8,1) 

devuelve el índice (posición) de str en el cadena1, cadena2, str3, ... la lista. Devuelve 0 si str no se encuentra.

Es una especie de hack feo, así que solo úsela si no tiene otra opción. Ordenar la salida en su aplicación puede ser mejor.