Orden de Mysql por valores de ID específicos


95

¿Es posible ordenar en mysql por "ordenar por" usando un conjunto predefinido de valores de columna (ID) como: ordenar por (ID = 1,5,4,3) para obtener el registro 1, 5, 4, 3 en ese ¿ordenar?

ACTUALIZACIÓN: Sobre el abuso de mysql ;-) Tengo que explicar por qué necesito esto ...

Quiero que mis registros cambien de orden aleatoriamente cada 5 minutos. Tengo una tarea cron para hacer la tabla de actualización para poner un orden de clasificación diferente y aleatorio en ella. ¡Solo hay un problema! PAGINACIÓN. Tendré un visitante que venga a mi página y le doy los primeros 20 resultados. Esperará 6 minutos y pasará a la página 2 y obtendrá resultados incorrectos ya que el orden de clasificación ya había cambiado.

Así que pensé que si él llegaba a mi sitio, ponía todos los ID en una sesión y cuando él estaba en la página 2, sacaba los registros correctos incluso si la clasificación ya había cambiado.

¿Hay alguna otra forma mejor de hacer esto?


¿Está preguntando si hay alguna forma de que mysql pueda ordenar sin ningún orden en particular?
stefgosselin

1
Parece que su modelo de datos está roto / incompleto (¿de dónde viene este orden?) O, alternativamente, está abusando de MySQL.
derobert

Respuestas:


202

Puede utilizar la función ORDER BY y FIELD. Ver http://lists.mysql.com/mysql/209784

SELECT * FROM table ORDER BY FIELD(ID,1,5,4,3)

Utiliza la función Field () , que "Devuelve el índice (posición) de str en la lista str1, str2, str3, .... Devuelve 0 si no se encuentra str" según la documentación. Entonces, en realidad, ordena el conjunto de resultados por el valor de retorno de esta función, que es el índice del valor del campo en el conjunto dado.


Parece que no puedo hacer que esto funcione sin usar también: WHERE ID IN (1,5,4,3)
TV-C-15

¿Cómo usarías esto con valores Ninguno?
Nono London

30

Debería poder usar CASEpara esto:

ORDER BY CASE id
  WHEN 1 THEN 1
  WHEN 5 THEN 2
  WHEN 4 THEN 3
  WHEN 3 THEN 4
  ELSE 5
END

18

En la documentación oficial de mysql sobre ORDER BY , alguien ha publicado que puede usar FIELDpara este asunto, así:

SELECT * FROM table ORDER BY FIELD(id,1,5,4,3)

Este es un código no probado que, en teoría, debería funcionar.


7
SELECT * FROM table ORDER BY id='8' DESC, id='5' DESC, id='4' DESC, id='3' DESC

Si tuviera 10 registros, por ejemplo, de esta manera aparecerán primero los ID 1, 5, 4 y 3, los demás registros aparecerán a continuación.

Exposición normal 1 2 3 4 5 6 7 8 9 10

De esta manera

8 5 4 3 1 2 6 7 9 10


Ok Gracias por el consejo
Bruno Mangini Alves

6

Hay otra forma de solucionar esto. Agregue una tabla separada, algo como esto:

CREATE TABLE `new_order` (
  `my_order` BIGINT(20) UNSIGNED NOT NULL,
  `my_number` BIGINT(20) NOT NULL,
  PRIMARY KEY (`my_order`),
  UNIQUE KEY `my_number` (`my_number`)
) ENGINE=INNODB;

Esta tabla ahora se utilizará para definir su propio mecanismo de pedido.

Agregue sus valores allí:

my_order | my_number
---------+----------
       1 |         1
       2 |         5
       3 |         4
       4 |         3

... y luego modifique su declaración SQL mientras se une a esta nueva tabla.

SELECT *
FROM your_table AS T1
INNER JOIN new_order AS T2 on T1.id = T2.my_number
WHERE ....whatever...
ORDER BY T2.my_order; 

Esta solución es un poco más compleja que otras soluciones, pero al usarla, no tiene que cambiar su SELECTdeclaración cada vez que cambian los criterios de su pedido, simplemente cambie los datos en la tabla de pedidos.


0
SELECT * FROM TABLE ORDER BY (columnname,1,2) ASC OR DESC

2
¿Puedes explicar eso más? Esto se parece a la respuesta aceptada, pero no creo que ASC OR DESCsea ​​la sintaxis adecuada
Nico Haase

@NicoHaase, la diferencia entre ASC y DESC es que si usa asc, los identificadores que usa en la función de campo aparecerán al final y si usa DESC, los identificadores en la función de campo aparecerán primero
Hisham shahid

@NicoHaase puede usar ASC o DESC con la consulta según el requisito
Hisham shahid

Por lo tanto, no puede usar ambos en una consulta. Nico creo que sugirió que hiciste tu respuesta sintácticamente correcta. Estoy bastante seguro de que está familiarizado con lo que realmente significan ASD y DESC :)
RiggsFolly

0

Si necesita solicitar una única identificación primero en el resultado, use la identificación.

select id,name 
from products
order by case when id=5 then -1 else id end

Si necesita comenzar con una secuencia de múltiples identificadores, especifique una colección, similar a la que usaría con una INdeclaración.

select id,name 
from products
order by case when id in (30,20,10) then -1 else id end,id

Agregue un poco más de descripción
Mathews Sunny

si desea usar order by para solo una identificación, use la primera consulta y si desea múltiples identificaciones, use la segunda consulta
Rajesh Kharatmol

0

Si desea ordenar una única identificación al final del resultado, use el orden por caso. (Por ejemplo: desea la opción "otra" en último lugar y la lista de todas las ciudades se muestra en orden alfabético).

select id,city 
from city
order by case 
when id = 2 then city else -1 
end, city ASC

Si tuviera 5 ciudades, por ejemplo, quiero mostrar la ciudad en orden alfabético con la opción "otra" mostrar la última en el menú desplegable, entonces podemos usar esta consulta. vea el ejemplo, otros se muestran en mi tabla en la segunda identificación (identificación: 2), así que estoy usando "cuando identificación = 2" en la consulta anterior.

registro en la tabla DB:

Bangalore - id:1
Other     - id:2
Mumbai    - id:3
Pune      - id:4
Ambala    - id:5

mi salida:

Ambala  
Bangalore  
Mumbai  
Pune
Other

2
Intente agregar alguna explicación a su código, hará que su respuesta sea más clara y comprensible. Por favor lea stackoverflow.com/help/how-to-answer
32cupo

si desea usar order by para una sola identificación (por ejemplo: desea que la opción "otra" al final y la lista de todas las ciudades se muestre en orden alfabético), entonces puede usar esta consulta. está funcionando para mí.
Preeti
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.