2010-02-01 18 views
18

tengo una consulta como esta: SELECT * FROM table WHERE id IN (2,4,1,5,3);MySQL ordenación personalizada

Sin embargo, cuando lo imprimo fuera, es automáticamente clasificadas 1.2.3.4.5. ¿Cómo podemos mantener el orden (2,4,1,5,3) sin cambiar la estructura de la base de datos?

Gracias!

Respuesta

20

Lo pregunto:

mysql order by issue

las respuestas que recibo y todo el crédito pertenecen a ellos es:

Se puede utilizar un operador de CASE para especificar el orden:

SELECT * FROM table 
WHERE id IN (3,6,1,8,9) 
ORDER BY CASE id WHEN 3 THEN 1 
       WHEN 6 THEN 2 
       WHEN 1 THEN 3 
       WHEN 8 THEN 4 
       WHEN 9 THEN 5 
     END 

en php usted puede hacerlo como:

<?php 

$my_array = array (3,6,1,8,9) ; 

$sql = 'SELECT * FROM table WHERE id IN (3,6,1,8,9)'; 

$sql .= "\nORDER BY CASE id\n"; 
foreach($my_array as $k => $v){ 
    $sql .= 'WHEN ' . $v . ' THEN ' . $k . "\n"; 
} 
$sql .= 'END '; 

echo $sql; 

?> 
+6

Lucas Rossini La solución de Ferreira es mucho más simple que esto. – mkataja

+0

sí, tienes razón –

2

El orden por el campo nunca trabajó para mí. Tenía una lista de países y que necesitaba Estados Unidos y Canadá a aparecer en la parte superior de la lista, por lo que mi pregunta era la siguiente:

SELECT * FROM countries ORDER BY code='USA', code='CAN', name ASC 

Esto nunca funcionó, pero me di cuenta que el orden era diferente, era mostrando Canadá y los Estados al final de la lista, así que hice esto:

SELECT * FROM countries ORDER BY code!='USA', code!='CAN', name ASC 

Y funcionó ... ¿por qué? Me gana, pero acaba de hacer; pruébalo también.

5

(yo habría escrito esto como un comentario sobre la respuesta de Michel Tobón, pero no tienen la reputación, lo siento :-)

"y funcionó ... ¿Por qué? Es mejor que yo, pero acaba de hacer ; inténtalo también ".

La razón por la que funciona es porque su expresión "code! = 'USA'" está produciendo un resultado booleano, que en SQL se representa como 1 o 0. Entonces, la expresión "code = 'USA' produce un 1 por cada registro que coincida con ese criterio, y un 0 por cada registro que no lo haga. Debido a que 1 es posterior a 0 en una clasificación ascendente (el valor predeterminado), los registros coincidentes se ordenarán más tarde que los que no coinciden. .

Otra forma (posiblemente más clara) de producir el mismo resultado sería la siguiente:

SELECT * FROM countries ORDER BY code='USA' DESC, code='CAN' DESC, name ASC 

por supuesto, en una cambiar la pregunta del OP, me gusta más la opción FIELD(): bastante limpia :-)

+0

Explicado muy bien. – ChristianLinnell

+0

Gracias :-) (¡Tengo suficiente reputación para comentar ahora! :-D) – opensourcejunkie

Cuestiones relacionadas