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