varias registros por poner ordenar ordenamiento orden numerico funciones fecha ejemplos descendente como columnas mysql sorting

registros - Orden Mysql por valores de ID específicos



ordenar varchar por orden numerico (5)

¿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: Acerca de abusar de mysql ;-) Tengo que explicar por qué necesito esto ...

Quiero que mis registros cambien de forma aleatoria cada 5 minutos. Tengo una tarea cron para hacer la tabla de actualización para poner orden de clasificación diferente, aleatorio en él. ¡Solo hay un problema! PAGINACIÓN. Tendré un visitante que viene a mi página y le doy los primeros 20 resultados. Esperará 6 minutos e irá a la página 2 y tendrá resultados incorrectos ya que el orden de clasificación ya ha cambiado.

Así que pensé que si venía a mi sitio, colocaba todas las identificaciones en una sesión y cuando estaba en la página 2 obtenía los registros correctos, incluso si la clasificación ya había cambiado.

¿Hay alguna otra forma, mejor, para hacer esto?


Debería poder usar CASE para esto:

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


En la documentación oficial de mysql acerca de ORDER BY , alguien ha publicado que puede usar FIELD para 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.


Hay otra manera de resolver esto. Agrega una tabla por separado, 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 se usará ahora para definir su propio mecanismo de orden.

Agregue sus valores allí:

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

... y luego modifique su declaración de SQL al unirse 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 indicación SELECT cada vez que cambien los criterios de su orden, simplemente cambie los datos en la tabla de órdenes.


Puede usar 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 str no se encuentra" de acuerdo con la documentación. Entonces, en realidad, ordena el resultado establecido por el valor de retorno de esta función, que es el índice del valor del campo en el conjunto dado.


SELECCIONAR * 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 la ID 1, 5, 4 y 3 aparecerán primero, 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