MySQL: ordenando query del tipo id IN array - Userlinux.net

Por exigencia del guión, cuando conectas con Sphinx para hacer una búsqueda, éste devuelve los id\'s de los resultados coincidentes ordenados por relevancia (al menos en nuestro caso, que usamos el método SetFieldWeights). [matches] => Array ( [100] => Array ( [weight] => 100 ) [50] => Array ( [weight]…

MySQL: ordenando query del tipo id IN array

23.Jun.2009 ~ 4 Comentarios ~ 1422 Lecturas
Por exigencia del guión, cuando conectas con Sphinx para hacer una búsqueda, éste devuelve los id's de los resultados coincidentes ordenados por relevancia (al menos en nuestro caso, que usamos el método SetFieldWeights).
[matches] => Array
(
 [100] => Array ( [weight] => 100 )
 [50]  => Array ( [weight] => 70 )
 [200] => Array ( [weight] => 30 )
 [30]  => Array ( [weight] => 30 )
)
La pregunta es, ¿cómo hacer que MySQL respete ese mismo orden?. Vamos, que si tenemos un "SELECT * FROM productos WHERE id IN (100, 50, 200, 30)" y queremos los resultados justamente en ese orden (100, 50, 200 y 30) tendremos que indicarlo en MySQL de alguna forma, puesto que por defecto (al menos en nuestras pruebas / instalaciones) ordena por la primary key...

La respuesta es simple, pero me ha costado tiempo encontrarla, así que ahí queda por si pudiera servir de algo:
SELECT * FROM productos WHERE id IN (100, 50, 200, 30) ORDER BY field(id, 100, 50, 200, 30)
La única referencia que he encontrado ha sido ésta, comparando con PostgreSQL, tal vez alguien más sepa algo ;).

Comentarios


gravatar
24.Jun.2009
Mismo caso, mismo problema pero distinta solución. Un ORDER BY siempre penaliza rendimiento, mas si haces un WHERE IN con muchos IDs, así que opté por ordenar en PHP, añadiendo filtro a la "capa de abstracción"...

gravatar
24.Jun.2009
He usado las mismas soluciones, ORDER BY FIELD para IN's pequeños y ordenación PHP para grandes. Además, por increible que pueda parecer, aún con un índice primario, y dependiendo tanto del tamaño de la tabla como de los propios ids a seleccionar, NO ES LO MISMO (en términos de velocidad) un "WHERE id=1 OR id=2 ... OR id=n" que un "WHERE id IN (1,2,...n)"

gravatar
24.Jun.2009
Mmm, pues no sé qué penalizará más el rendimiento, si el coste computacional de descargar esa tarea en el SGDB, que ya está optimizado _y compilado_ para esas consultas, o mandarlo a PHP, que está interpretado, y tratar desde PHP la ordenación. Habría que coger por un lado MySQL y tirarle benchmarks, EXPLAIN y demás y por otro con JMeter o similar para averiguarlo. Es la típica tarea de sábado por la noche. Lo normal en Valencia.

gravatar
24.Jun.2009
En este caso el array debería ser máximo de 10 elementos, pero tampoco descarto hacer una ordenación por PHP. Gracias a ambos por los tips :).

Comentarios


Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 15 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Buscar

Cargando...

Últimos comentarios

  • Juan
  • Marina
  • Francisco
  • fon
  • minWi
  • isra
  • reidrac
  • r0sk
  • Rodrigo Rega
  • minWi
  • r0sk
  • reidrac
  • r0sk
  • deady
  • errece

Moneting

Valor de mi cuenta de Facebook según Moneting
Valor de mi cuenta de Twitter según Moneting

Tagcloud

ssh frases champions userlinux iphone lugo rsidenotes felicidades films nintendo opinion sysadmin 2008 blogsfera vacaciones juegos cake ds debian sidenotes apple web blogs mac mysql cakephp deportes 2007 mundial openbsd barça ubuntu twitter blog humor meme canción alemania_2006 games bsd lucux linux twitt programación cumpleaños software django league bash macosx ps3 rfilms conciertos freebsd seguridad personal hack php bake futbol

Archivo

Social

Enlaces de interés