Ordenar primero por valor de campo específico

92

Tengo una tabla con 3 columnas:

id | name | priority
--------------------
 1 | core  |   10
 2 | core  |   9
 3 | other |   8
 4 | board |   7
 5 | board |   6
 6 | core  |   4

Quiero ordenar el conjunto de resultados usando prioritypero primero aquellas filas que tienen name=coreincluso si tienen menor prioridad. El resultado debería verse así

id | name | priority
--------------------
 6 | core  |   4
 2 | core  |   9
 1 | core  |   10
 5 | board |   6
 4 | board |   7
 3 | other |   8
Omid
fuente

Respuestas:

160

También está la función MySQLFIELD .

Si desea una clasificación completa de todos los valores posibles:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core", "board", "other")

Si solo te importa que el "núcleo" sea lo primero y los demás valores no importan:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC

Si desea ordenar primero por "núcleo" y los otros campos en el orden de clasificación normal:

SELECT id, name, priority
FROM mytable
ORDER BY FIELD(name, "core") DESC, priority

Sin embargo, aquí hay algunas advertencias:

Primero, estoy bastante seguro de que esta es una funcionalidad solo de mysql: la pregunta está etiquetada como mysql, pero nunca se sabe.

En segundo lugar, preste atención a cómo FIELD()funciona: devuelve el índice basado en uno del valor; en el caso de FIELD(priority, "core"), devolverá 1 si "core" es el valor. Si el valor del campo no está en la lista, devuelve cero . Por eso DESCes necesario a menos que especifique todos los valores posibles.

Nerdmaster
fuente
5
Después de unos 5 años, cambié la respuesta aceptada a esta porque es más limpia y rápida.
Omid
equivalente a db2?
Cybermonk
Me funcionó, me gustaría hacer una pregunta más sobre cómo manejar Si la columna 'prioridad' contiene valores como ex: 'núcleo terrestre', 'tablero nuevo', etc. Aquí la columna no contiene un valor exacto, ¿podemos escribir algo como %núcleo%?
Jayanth Suvarna
@JayanthSuvarna: mirando los documentos de MySQL FIELD (), estoy bastante seguro de que no hay forma de evaluar esto como subcadenas, ya que cada argumento tiene que ser algún tipo de cadena. Puede haber algunas funciones de manipulación de cadenas que podrían ayudar, pero no estoy seguro.
Nerdmaster
Gracias amigo. Me has alegrado el día.
BEingprabhU
92

Generalmente puedes hacer

select * from your_table
order by case when name = 'core' then 1 else 2 end,
         priority 

Especialmente en MySQL también puedes hacer

select * from your_table
order by name <> 'core',
         priority 

Dado que el resultado de una comparación en MySQL es 0o 1y puede ordenar por ese resultado.

juergen d
fuente
1
¿Qué significa 1y qué 2significa aquí?
Niraj Chauhan
1
Tengo alrededor de 3000 filas para ordenar. En mi caso, la solución de @ Ayman-Hourieh en stackoverflow.com/questions/958627/… toma la mitad del tiempo en comparación con esta solución.
Nightlyop
@nightlyop: Buena. Solo una nota: la solución más rápida es específica de MySQL.
juergen d
1y 2son solo 2 números que uso para ordenar los datos. Podría ser 3y 4u otra cosa.
juergen d
¿Qué pasa cuando hay %en la WHEREcláusula? Al igual que . . . WHERE name LIKE '%sth%' . . .? stackoverflow.com/questions/41303379/...
pila
6

Una forma de dar preferencia a filas específicas es agregar un gran número a su prioridad. Puede hacer esto con una CASEdeclaración:

  select id, name, priority
    from mytable
order by priority + CASE WHEN name='core' THEN 1000 ELSE 0 END desc

Demostración: http://www.sqlfiddle.com/#!2/753ee/1

mellamokb
fuente
5

Esto me funciona usando Postgres 9+:

SELECT *
FROM your_table
ORDER BY name = 'core' DESC, priority DESC
Vojtech Vitek
fuente
¿Te importaría explicar -1? Error + versión de Postgres?
Vojtech Vitek
3

Una forma es esta:

select id, name, priority from table a
order by case when name='core' then -1 else priority end asc, priority asc
Ícaro
fuente
1
¿No perderá esto el orden de las corefilas?
mellamokb
1
SELECT * FROM cars_new WHERE status = '1' and car_hide !='1' and cname IN ('Executive Car','Saloon','MPV+','MPV5') ORDER BY FIELD(cname, 'Executive Car', 'Saloon','MPV+','mpv5')
meiy arul
fuente
3
Aunque su código puede ser la respuesta a la pregunta, es mejor proporcionar alguna explicación al respecto.
Mehraban
0

hacer esto:

SELECT * FROM table ORDER BY column `name`+0 ASC

Agregar el +0 significará que:

0, 10, 11, 2, 3, 4

se convierte en:

0, 2, 3, 4, 10, 11
Madhuka Dilhan
fuente
Esta técnica sirve para convertir una cuerda en un número. No aborda la pregunta del PO. (Sin embargo, sin ver el tipo de datos de priority, no puedo decir si debería ser parte de la solución completa).
Rick James
0

Utilizar esta:

SELECT * 
FROM tablename 
ORDER BY priority desc, FIELD(name, "core")
Saquib Azam
fuente