mysql SQL: elemento específico para ser el primero y luego ordenar el resto de los elementos

80

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!

ufk
fuente

Respuestas:

148
select id,name 
from friends 
order by id=5 desc

(dado que no le importa el orden del resto, de lo contrario, por ejemplo, resto por id asc )

select id,name 
from friends 
order by id=5 desc, id asc
RichardTheKiwi
fuente
10
@ maxx777 Esta pregunta está etiquetada como MySQL, que ahora es propiedad de Oracle. No "sql-server", como en Microsoft SQL Server.
RichardTheKiwi
1
Creo que la mayoría de las consultas funcionan en todos los DBMS. Y si alguien dice que esta consulta no está funcionando en un DBMS en particular, generalmente está pidiendo una solución para ese DBMS en particular.
maxx777
8
@ maxx777 Por eso tenemos etiquetas y preguntas separadas. Funcionó para el solicitante de su problema MySQL. Si desea SQL Server 2005, la otra respuesta lo tiene, no es necesario comentar sobre lo obvio de que esta respuesta no funciona en lo que nunca se anunció.
RichardTheKiwi
48

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
Dumitrescu Bogdan
fuente
4

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.

Amadan
fuente
3
Prefiero id=5 desc, porque cuando la columna incluye nulos, !=5pone los nulos primero
RichardTheKiwi
2

Si 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.

Ucello
fuente
2

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

  • id = algo, ordenar por id asc
  • ordenar por caso cuando algo luego 1 cuando algo_else luego 2 final desc
Monty Python
fuente
1
No estoy seguro de por qué se votó en contra. Me gustaría saber por qué el orden por campo debería ser mejor, pero la respuesta es interesante.
Juan
@John: esto es mejor principalmente debido a la facilidad de lectura. Además, es una solución que MySQL nos proporciona de forma inmediata. Simplemente me parece que cuando tienes que especificar el orden de muchos valores en una columna, esto tiene más sentido.
MontyPython
1
Creo que la gente simplemente no entendió que proporcionó un ejemplo con la "unión de todos" y la solución a la pregunta con el campo ORDER BY. Por lo tanto, los votos negativos se deben a la incompetencia.
John
Verifico todas mis respuestas teniendo en cuenta la publicación de @ Strawberry: meta.stackoverflow.com/questions/333952/… .
MontyPython
2

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.

Jeffrey Neo
fuente
-7

Esto es un poco feo porque tiene duplicación de código, pero funciona:

select .... where id = 5 
union
select .... where not id = 5
Ilya Kogan
fuente
2
Si las filas permanecen ordenadas después de una unión, es solo un accidente. Y si especifica un order by, clasificará toda la unión.
Andomar