Digamos que tengo la tabla de abajo.
Quiero tener a todos los amigos, pero quiero que el id 5 sea el primer elemento de la lista. No me importa el orden en que recibo el resto de los artículos.
El resultado de la consulta deseado será:
friends
-------
id name
5 nahum
1 moshe
2 haim
3 yusuf
4 gedalia
6 dana
¿Cómo puedo hacer esto?
utilizando Mysql 5.1.x.
¡Gracias!
Prueba esto:
select id,name from friends order by case when id=5 then -1 else id end
si tiene más de uno, puede hacer:
select id,name from friends order by case when id in (5,15,25) then -1 else id end,id
fuente
No puedo acceder a MySQL ahora para probar, por lo que podría revertirse ... pero puede usar el hecho de que los booleanos también ordenan, y que puede tener varios campos de clasificación.
SELECT ... ORDER BY id != 5, id
(es posible que tenga que escribir
id = 5
, no recuerdo si los VERDADEROS se ordenan antes o después de los FALSOS).EDITAR: Oh, acabo de leer que no te importa el orden del resto, en cuyo caso recomiendo de todo corazón la respuesta de @Richard.
fuente
id=5 desc
, porque cuando la columna incluye nulos,!=5
pone los nulos primeroSi desea hacer lo mismo para la consulta UNION, por ejemplo, si tiene:
select id,name from friends UNION select id,name from friends order by id=5 desc
... obtendría una excepción en PostgreSQL:
Solo se pueden usar nombres de columnas de resultados, no expresiones ni funciones. SUGERENCIA: agregue la expresión / función a cada SELECT, o mueva UNION a una cláusula from
Para evitar esto, usaría lo siguiente:
select id,name, (id=5) AS is_five from friends UNION select id,name, (id=5) AS is_five from friends order by is_five DESC, id DESC
La expresión (id = 5) devolvería 't' O 'f', dependiendo de si el valor de su columna es igual o no al valor esperado (5), por lo que el orden por primero ordenaría las columnas 't', luego el descanso.
fuente
Debe usar la cláusula ORDER BY FIELD de MySQL para resolver esto. Aunque se ha aceptado la respuesta a esto, aquí hay una mejor solución.
select 1 id, 'Zeta' order_col union all select 2 id, 'Alpha' order_col union all select 3 id, 'Gamma' order_col union all select 4 id, 'Phi' order_col union all select 5 id, 'Delta' order_col union all select 6 id, 'Delta' order_col union all select 7 id, 'Alpha' order_col union all select 8 id, 'Gamma' order_col union all select 9 id, 'Zeta' order_col union all select 10 id, 'Phi' order_col order by field (order_col, 'Alpha', 'Gamma', 'Phi', 'Delta', 'Zeta'), id;
Esto es mejor que
fuente
Puede usar
field()
en MySQL.select id,name from friends order by field(id,5,id)
El primer parámetro en el campo () significa el campo con el que desea ordenar, el resto está ordenando.
Entonces, 5 se ordenarán primero y el resto de id (sin 5). Puedes hacer como
field(id,5,1,3,id)
si quieres que 5,1,3 esté al frente.5 se pueden elegir para ordenar por fin
field(id,id,5)
. La segunda identificación también excluirá a 5.fuente
Esto es un poco feo porque tiene duplicación de código, pero funciona:
select .... where id = 5 union select .... where not id = 5
fuente
order by
, clasificará toda la unión.