2011-07-12 16 views
14

En mi base de datos tengo algunos registros en los que estoy clasificación por lo que pasa a ser el mismo valor:cómo MySQL ordenar las filas con los mismos valores

| col1 | timestamp    | 
| row1 | 2011-07-01 00:00:00 | 
| row2 | 2011-07-01 00:00:00 | 
| row3 | 2011-07-01 00:00:00 | 

SELECT ... ORDER BY timestamp 

Parece que el resultado está en un orden aleatorio. Es la orden aleatoria consistente. Eso significa que si tengo estos datos en dos servidores mysql. ¿Puedo esperar el mismo resultado?

Respuesta

10

Aconsejo no hacer esa suposición. En SQL estándar, todo lo que no requiere una cláusula ORDER BY explícita depende de la implementación.

No puedo hablar por MySQL, pero p. Ej. SQL Server, el orden de salida para las filas que son "iguales" en lo que concierne al ORDER BY puede variar cada vez que se ejecuta la consulta, y podría verse influenciado por prácticamente cualquier cosa (por ejemplo, parche/paquete de servicio del servidor, carga de trabajo, las páginas se encuentran actualmente en el grupo de búferes, etc.).

Por lo tanto, si necesita un pedido específico, lo mejor que puede hacer (tanto para garantizarlo como para documentar su consulta para futuros mantenedores) es solicitar explícitamente el pedido que desea.

+4

+1 nota: buscar otra columna se puede ordenar por un segundo argumento para obtener resultados consistentes – Jacob

+0

El orden que las filas son devueltas está garantizada SOLAMENTE por la cláusula 'ORDER BY' (o en MySQL, un' ORDER BY' implícitamente especificado en la cláusula 'GROUP BY'). Aparte de eso, NO HAY GARANTÍA de que las filas de orden sean devueltas in. Aparte de eso, MySQL puede devolver las filas en cualquier secuencia. – spencer7593

2

Eso depende del motor de almacenamiento utilizado. En MyISAM se ordenarán en orden natural (es decir, para que estén almacenados en el disco, que se puede cambiar usando el comando ALTER TABLE ... ORDER BY). En InnoDB, serán pedidos por PK. Otros motores pueden tener sus propias reglas.

+0

Es InnoDB sin PK ... – atiking

+1

InnoDB siempre tiene un PK. Si no creó uno explícitamente, InnoDB creó su propio PK de 6 bytes. – Mchl

+0

por lo que el orden aleatorio no es consistente, porque el PK puede ser diferente? – atiking

2

En orden por condición si las filas son los mismos valores o si desea organizar los datos seleccionando ORDER BY. CASO: Desea ORDENAR POR los valores de la columna son la frecuencia de las palabras. Y dos palabras en la tabla pueden tener el mismo valor de frecuencia en la columna de ocurrencia de frecuencia. Por lo tanto, en la columna de frecuencia tendrá dos frecuencias iguales de dos palabras diferentes. Por lo tanto, en "select * from database_name ORDER BY frequency" puede encontrar cualquiera de las dos palabras con la misma frecuencia apareciendo justo antes de su último. Y en segunda ejecución, aparece la otra palabra que se muestra después de la primera palabra que aparece antes. Depende de la memoria intermedia, las páginas están entrando y saliendo en el momento, etc.

6

Ya hay muchas respuestas, pero la respuesta final es NO.

Si desea filas devueltas en una secuencia particular, consistentemente, especifíquelas en un ORDER BY. Sin eso, no hay NINGUNA GARANTÍA en qué orden se devolverán las filas.

Creo que lo que puede faltar es que puede haber varias expresiones enumeradas en la cláusula ORDER BY. Y puede incluir expresiones que no están en la lista SELECCIONAR.

En su caso, por ejemplo, puede usar ORDER BY timestamp, id.

(O algunas otras columnas o expresiones.)

que ordenará las filas primeras en fecha y hora, y luego las filas que tienen el mismo valor de marca de tiempo se ordenarán por id, o lo que sea la siguiente expresión en este lista es

1

La respuesta es: No, el pedido no será coherente. Me enfrenté al mismo problema y lo resolví agregando otra columna a la sección de pedidos. Asegúrese de que esta columna sea única para cada registro como 'ID' o lo que sea.

En este caso, debe agregar el campo 'ID' a su tabla que es único para cada registro. Puede asignarlo 'AI' (incremento automático) para que no se ocupe del mantenimiento.

Después de añadir la columna 'ID', actualice la última parte de su consulta como:

SELECT mt.* 
FROM my_table mt 
ORDER BY mt.timestamp ASC, mt.id DESC 
Cuestiones relacionadas