MySQL 'Ordenar por': ordenación alfanumérica correctamente

Resuelto Shackrock asked hace 13 años • 20 respuestas

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 ascordenaciones 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
Shackrock avatar Dec 19 '11 11:12 Shackrock
Aceptado

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;
Jomoos avatar Dec 19 '2011 05:12 Jomoos

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

AO_ avatar Mar 03 '2016 18:03 AO_

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
ajreal avatar Dec 19 '2011 05:12 ajreal

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.

antoine avatar Oct 16 '2013 20:10 antoine

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;
Shiv Buyya avatar Jun 25 '2018 09:06 Shiv Buyya