2010-06-02 20 views
8

¿Existe una manera fácil de pedir resultados MySQL respectivamente por WHERE id IN (...) cláusula? Ejemplo:MySQL que especifica el orden exacto con WHERE `id` IN (...)

SELECT * FROM articles WHERE articles.id IN (4, 2, 5, 9, 3) 

para volver

Article with id = 4 
Article with id = 2 
Article with id = 5 
Article with id = 9 
Article with id = 3 

y también

SELECT * FROM articles WHERE articles.id IN (4, 2, 5, 9, 3) LIMIT 2,2 

para volver

Article with id = 5 
Article with id = 9 

Actualización: para ser más específicos, quiero evitar la manipulación de los datos en p arentheses en WHERE articles.id IN (4, 2, 5, 9, 3), ya que esos ID son dinámicos y ordenados automáticamente.

Respuesta

14

Sí, tipo de:

SELECT * FROM articles 
WHERE articles.id IN (4, 2, 5, 9, 3) 
ORDER BY FIND_IN_SET(articles.id, '4,2,5,9,3') 

pero esto es SQL no estándar y huele un poco.

+4

+1 para la solución pragmática. Y para la parte "huele un poco". ;) – Tomalak

+0

Los resultados son exactamente lo que estaba buscando, muchas gracias. –

0

No creo que puedas hacer eso. No hay órdenes "explícitas" en curso; la declaración "in" simplemente le dice qué recuperar y no tiene información sobre el pedido.

Dado que los ejemplos que ha dado no tienen un orden obvio, su mejor opción es manejar esto en el código después de que se devuelva el resultado.

1

MySQL solo ordena con ORDER BY. Es por eso que no es terriblemente raro que las tablas de la base de datos tengan algo así como una columna de ordinalidad.

articles 
+----+------------+-------+ 
| id | ordinality | (...) | 
+----+------------+-------+ 
| 2 |   2 | '' | 
| 3 |   5 | '' | 
| 4 |   1 | '' | 
| 5 |   3 | '' | 
| 9 |   4 | '' | 
+----+------------+-------+ 

SELECT * 
    FROM articles 
WHERE articles.id IN (4, 2, 5, 9, 3) 
ORDER BY articles.ordinality 
3

Esto funciona para mí: ORDER BY CAMPO (Product.id, 4,9,8,5,3,11,24,16)

+0

Esto funciona y en realidad es más rápido que la respuesta aceptada en mi máquina. Probé con 1000 registros y 'find_in_set' tomó 0.03 segundos y' field' tomó 0.02 segundos. Supongo que esta diferencia se volvería más marcada con conjuntos más grandes. También probé con una cláusula "LIMIT 2" y 'find_in_set' en realidad tomó más tiempo, 0.04 segundos, mientras que' field' aún tardó 0.02 segundos. Personalmente, creo que 0.02sec es bastante lento. ¡El OP debe tener cuidado de no pasar grandes conjuntos de datos o tendrá un golpe de rendimiento! – Coder

Cuestiones relacionadas