MySQL 'Ordenar por': ordenación alfanumérica correctamente
Quiero ordenar los siguientes elementos de datos en el orden en que se presentan a continuación (números del 1 al 12):
1 2 3 4 5 6 7 8 9 10 11 12
Sin embargo, mi consulta: utilizar order by xxxxx asc
ordenaciones por el primer dígito por encima de todo:
1 10 11 12 2 3 4 5 6 7 8 9
¿Algún truco para que se ordene mejor?
Además, en aras de una divulgación completa, esto podría ser una combinación de letras y números (aunque en este momento no lo es), por ejemplo:
A1 534G G46A 100B 100A 100JE
etc....
¡Gracias!
actualización: personas que solicitan una consulta
select * from table order by name asc
La gente usa diferentes trucos para hacer esto. Busqué en Google y descubrí algunos resultados, cada uno sigue diferentes trucos. Míralos:
- Clasificación alfanumérica en MySQL
- Clasificación natural en MySQL
- Clasificación de valores numéricos mezclados con valores alfanuméricos
- clasificación natural mySQL
- Ordenación natural en MySQL
Editar:
Acabo de agregar el código de cada enlace para futuros visitantes.
Clasificación alfanumérica en MySQL
entrada dada
1A 1a 10A 9B 21C 1C 1D
Rendimiento esperado
1A 1C 1D 1a 9B 10A 21C
Consulta
Bin Way
===================================
SELECT
tbl_column,
BIN(tbl_column) AS binray_not_needed_column
FROM db_table
ORDER BY binray_not_needed_column ASC , tbl_column ASC
-----------------------
Cast Way
===================================
SELECT
tbl_column,
CAST(tbl_column as SIGNED) AS casted_column
FROM db_table
ORDER BY casted_column ASC , tbl_column ASC
Clasificación natural en MySQL
entrada dada
Tabla: sorting_test -------------------- ------------- | VARCHAR alfanumérico(75) | entero INT | -------------------- ------------- | prueba1 | 1 | | prueba12 | 2 | | prueba13 | 3 | | prueba2 | 4 | | prueba3 | 5 | -------------------- -------------
Rendimiento esperado
-------------------------- -------------
| alphanumeric VARCHAR(75) | integer INT |
-------------------------- -------------
| test1 | 1 |
| test2 | 4 |
| test3 | 5 |
| test12 | 2 |
| test13 | 3 |
-------------------------- -------------
Consulta
SELECT alphanumeric, integer
FROM sorting_test
ORDER BY LENGTH(alphanumeric), alphanumeric
Clasificación de valores numéricos mezclados con valores alfanuméricos
entrada dada
2a, 12, 5b, 5a, 10, 11, 1, 4b
Rendimiento esperado
1, 2a, 4b, 5a, 5b, 10, 11, 12
Consulta
SELECT version
FROM version_sorting
ORDER BY CAST(version AS UNSIGNED), version;
Sólo haz 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
Odio esto, pero esto funcionará.
order by lpad(name, 10, 0) <-- assuming maximum string length is 10
<-- you can adjust to a bigger length if you want to
Sé que esta publicación está cerrada pero creo que mi manera podría ayudar a algunas personas. Entonces ahí está:
Mi conjunto de datos es muy similar pero es un poco más complejo. Tiene números, datos alfanuméricos:
1
2
Chair
3
0
4
5
-
Table
10
13
19
Windows
99
102
Dog
Me gustaría tener el símbolo '-' al principio, luego los números y luego el texto.
Entonces voy así:
SELECT name, (name = '-') boolDash, (name = '0') boolZero, (name+0 > 0) boolNum
FROM table
ORDER BY boolDash DESC, boolZero DESC, boolNum DESC, (name+0), name
El resultado debería ser algo:
-
0
1
2
3
4
5
10
13
99
102
Chair
Dog
Table
Windows
La idea es hacer una simple comprobación en SELECT y ordenar con el resultado.
Esto funciona para el tipo de datos: Datos1, Datos2, Datos3..., Datos21. Significa que la cadena "Datos" es común en todas las filas.
Para ORDER BY ASC se ordenará perfectamente, para ORDER BY DESC no es adecuado.
SELECT * FROM table_name ORDER BY LENGTH(column_name), column_name ASC;