MySQL - Order by alfanumerico

   
Vista:

Order by alfanumerico

Publicado por yaney (27 intervenciones) el 29/01/2018 18:13:50
Tengo una consulta cuyo listado resultante lo debo ordernar por dos campos,
Debe ordenarse por la columna 'Tipo' y dentro de 'Tipo' ordenar por la columna 'descripcion'
Necesito que lo ordene por las letras y luego los numeros, no solo por la primera letra.

Esta es mi consulta
SELECT * FROM productos order by tipo,descripcion;

la columna tipo la agrupa bien, pero luego dentro de esta la columna descripcion lo ordena asi

RL2
RL35
RL7
SR25
SR5

Y yo necesito que sea

RL2
RL7
RL35
SR5
SR25

Gracias de antemano
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Order by alfanumerico

Publicado por Leonardo Josué (400 intervenciones) el 29/01/2018 18:44:14
Hola yaney:

Para hacer la ordenación que quieres, tienes que separar tu cadena y ordenar por separado la parte alfabética de la parte numérica, ya que no es lo mismo ordenar una cadena que un número.

Imagina que tienes esta tabla con un campo tipo TEXTO:

1
2
3
4
5
6
7
8
9
10
11
mysql> CREATE TABLE tabla (campo VARCHAR(20));
Query OK, 0 rows affected (0.22 sec)
 
mysql> INSERT INTO tabla VALUES
    -> ('2'),
    -> ('35'),
    -> ('7'),
    -> ('25'),
    -> ('5');
Query OK, 5 rows affected (0.14 sec)
Records: 5  Duplicates: 0  Warnings: 0

Entonces, al ordenar por este campo, la ordenación de hace ALFABETICAMENTE, (en el caso de los números, ordena por su código ASCII

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT campo FROM tabla ORDER BY campo;
+-------+
| campo |
+-------+
| 2     |
| 25    |
| 35    |
| 5     |
| 7     |
+-------+
5 rows in set (0.00 sec)

Entonces, tienes que convertir tu cadena a un NUMERO para ordenar como quieres:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT campo FROM tabla ORDER BY CAST(campo as UNSIGNED);
+-------+
| campo |
+-------+
| 2     |
| 5     |
| 7     |
| 25    |
| 35    |
+-------+
5 rows in set (0.00 sec)

Para conversiones, checa esta liga:

https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html

Aquí valdrían que nos aclararas, ¿tus cadenas siempre se van a componer de dos caracteres alfanuméricos y después n caracteres numéricos? o cuál es la regla para formar las cadenas que estás comentando.

Revisa las funciones de caracteres para ver cómo puedes separar tu cadena, te pueden servir las funciones LEFT, RIGTH, SUBSTR() o SUBSTRING().

https://dev.mysql.com/doc/refman/5.7/en/string-functions.html

Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Order by alfanumerico

Publicado por yaney (27 intervenciones) el 30/01/2018 16:15:35
Hola Leonardo, he pasado dos días estudiando el asunto, no logro entender mucho.

He hecho algunas pruebas tomando datos de ejemplo de la tabla que estoy tratando de ordenar.
Se debe ordenar por el campo producto y luego por el campo descripción, por lo que tiene dos criterios de ordenamiento.

No obstante, yo he tratado de ordenar solo el campo descripción pero no consigo que se ordene como debe ser
Aquí te pongo mi ejemplo de la fracción con la que estoy probando.

mysql> SELECT descripcion FROM tabla1 ORDER BY CAST(descripcion as UNSIGNED);
+-------------+
| descripcion |
+-------------+
| SR11 |
| M7 |
| M11 |
| M2 |
| SR2 |
| SR11 |
+-------------+
6 rows in set, 6 warnings (0.00 sec)

No sé cómo hacer eso de dividir la cadena en letras y números para ordenarlos por separados.

El campo es alfanumérico del tipo varchar.
Se debe ordenar por este primer código pero luego tiene más cosas en la descripción, ejemplo de uno es
M11 conf 20 pz
Pero bastaría ordenar por el M11.

Saludos y Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Order by alfanumerico

Publicado por Leonardo Josué (400 intervenciones) el 30/01/2018 16:57:59
Hola de nuevo Yaney:

Creo que no quedó claro en donde está el problema así es que trataré de comenzar de nuevo:

La ordenación tal como la planteas no es ni una ordenación alfabética ni una ordenación numérica, sino que es una mezcla de ambas...

La primer parte (Las letras) quieres que se ordenen de manera alfabética, es decir A-B-C y donde AB es es antes que B. Hasta aquí, creo que no hay problema en entender esto.

El problema como te comenté es en la segunda parte ya que cuando hablamos de CADENAS, 12 está antes que 2 PORQUE ESTO SE ORDENA TAMBIÉN ALFABÉTICAMENTE

En otras palabras, 12 sería un equivalente de AB mientras que el 2 es B, por lo tanto AB va antes que B y por lo tanto 12 va antes que 2. ¿se entiende?

Entonces, lo que tienes que hacer es ordenar POR SEPARADO, ¿cómo haces esto? pues primero SEPARANDO TUS CADENAS. volvamos a tu ejemplo original;

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT * FROM tabla ORDER BY campo;
+-------+
| campo |
+-------+
| RL2   |
| RL35  |
| RL7   |
| SR25  |
| SR5   |
+-------+
5 rows in set (0.00 sec)

Ayer te comenté, que para separar las cadenas hay muchas formas de hacerlo, dependiendo de cómo estén formadas. Para el ejemplo, todas las cadenas comienzan con 2 caracteres y después 1 o varios números, entonces usando la función SUBSTR, podemos hacer algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT
    ->   campo,
    ->   SUBSTR(campo, 1, 2) parte_letras,
    ->   SUBSTR(campo, 3, LENGTH(campo)) parte_numeros
    -> FROM tabla;
+-------+--------------+---------------+
| campo | parte_letras | parte_numeros |
+-------+--------------+---------------+
| RL2   | RL           | 2             |
| RL35  | RL           | 35            |
| RL7   | RL           | 7             |
| SR25  | SR           | 25            |
| SR5   | SR           | 5             |
+-------+--------------+---------------+
5 rows in set (0.01 sec)

Esta es la primer parte, ahora, la segunda columna LA DEBEMOS CONVERTIR A NÚMERO, ya que sigue siendo una CADENA y entonces ordenar por ambos campos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SELECT
    ->   campo
    -> FROM tabla
    -> ORDER BY
    ->   SUBSTR(campo, 1, 2),
    ->   CAST(SUBSTR(campo, 3, LENGTH(campo)) AS UNSIGNED);
+-------+
| campo |
+-------+
| RL2   |
| RL7   |
| RL35  |
| SR5   |
| SR25  |
+-------+
5 rows in set (0.00 sec)

¿Se entiende?

¿Qué es lo que te toca hacer a ti? pues encontrar la manera para separar estas dos cadenas de acuerdo a como tienes tus datos. Pregúntale a SAN GOOGLE cómo puedes hacerlo y vuelve a revisar la documentación que te puse en la liga acerca de las funciones con caracteres de MySQL.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Order by alfanumerico

Publicado por yaney (27 intervenciones) el 30/01/2018 17:49:30
El concepto lo entendí, me refiero a que entendí que lo está ordenando todo alfabéticamente y no es lo que quiero, quiero las letras alfabeticamente y los números que los ordene de menos a mayor.

La parte que no logro resolver es que los códigos no son uniformes. Pueden contener 2 letras y dos números, una letra y dos o un numero, o simplemente ser una palabra o un texto, es un campo que describe el producto por tanto es muy variado.

He probado varias cosas sin resultados. Ya he buscado bastante, desafortunadamente no puedo estudiar Mysql desde cero, ojalá tuviera tiempo para eso.
Ahora bien, si lo hago exactamente como pones en tu ejemplo tengo este resultado


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> select id1, producto, descripcion from tabla1 order by producto,substr(descripcion, 1, 2), CAST(SUBSTR(descripcion, 3, LENGTH(descripcion))as unsigned);
+-----+----------+-------------+
| id1 | producto | descripcion |
+-----+----------+-------------+
|   3 | agujas   | M11         |
|   4 | agujas   | M2          |
|   2 | agujas   | M7          |
|   1 | agujas   | SR3         |
|   6 | agujas   | SR7         |
|   5 | agujas   | SR11        |
|  10 | tinta    | LR11        |
|  11 | tinta    | LR12        |
|   8 | tinta    | M12         |
|  12 | tinta    | M21         |
|   9 | tinta    | M3          |
|   7 | tinta    | RL12        |
+-----+----------+-------------+
12 rows in set, 3 warnings (0.00 sec)

Es decir ha ordenado los códigos que tienen dos lugares de letra y el resto números, pero como hacerlo para que sea variable??

Gracias de nuevo
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Order by alfanumerico

Publicado por Leonardo Josué (400 intervenciones) el 30/01/2018 19:27:32
Ánimo Yaney, no esperes encontrar en este foro ni en ningún otro una respuesta sólo para copiar y pegar... lo que aquí brindamos son ideas que te pueden servir pero que seguramente tendrás que adaptar a tus necesidades.

Trata de dividir tu problema, de tal forma que te sea más sencillo dar con una respuesta. Y sobre todo ten paciencia.

Veamos:

1
Pueden contener 2 letras y dos números, una letra y dos o un numero, o simplemente ser una palabra o un texto, es un campo que describe el producto por tanto es muy variado.

No sé si sólo sean estos tres casos o tengas más, pero independientemente de ello te preguntaría: ¿cuál sería tu lógica SIN USAR SQL para separar las cadenas como las necesitas? es decir, trata de explicar CON PALABRAS el algoritmo que seguirías para separar cada una de las cadenas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Order by alfanumerico

Publicado por Yaney (27 intervenciones) el 30/01/2018 19:51:53
A ver Leonardo.
De nuevo equivocado.
No quiero copiar y pegar la solución a mi problema.
Quiero entender las cosas para aprender a hacerlas de una vez. Copiando y pegando no se aprende. Pero tengo que hacer un trabajo y No tengo tiempo para aprender la pelusa de la contrapelusa de MySQL o sql pues trabajo mucho, tengo una exigencia de hacer una base de datos. En la que se me plantean situaciones como estás.
Busco soluciones que pueda entender dada mi escasa base...... Ah se que aquí dirás que me escudo en mi falta de conocimientos para que otros me hagan el trabajo, ya se como piensas sin tener idea de quien eres.
He visto otras respuestas tuyas y te completas así en todas, diciéndole a los que saben menos que estudien mas antes de preguntar sin saber si esa persona ya estudio todo lo que pudo pero por su escaso tiempo se dirige a compañeros solidarios que ya han resuelto su problemática.
Cuando uno decide ayudar a una persona no debe estar menospreciando sus conocimientos ni es bonito hacerse el sabiondo.
Con esa actitud es mejor no ayudar.
No todos saben entender los códigos de programación como tu que debes llevar años en eso. Yo tengo muchas responsabilidades en mi vida y mucho trabajo, no puedo dedicarle la vida a mysql.
Y te equivocas en eso de que no encontraré a nadie que me explique de forma más asequible como puedo hacer un ordenamiento de tabla por un campo alfanumerico. Es que pareces vivir dentro de este foro sal y veras como hay mucha ayuda útil y sencilla afuera.
Esta consulta es bien avanzada y estoy buscando hasta entender si es posible hacerla o no.
Pero yo te quiero hacer una.pregunta, por qué respondes a mis preguntas?
Sabes que fuera de este foro existe una vida. Hay otras personas, otros tipos de personas, hay diversidad. No todos tienen el tiempo de dedicar su vida a una cosa, hay quienes sabemos un poco de todo lo que nos hace falta para sobrevivir.
Pero si te parece que sólo quiero copiar y que me hagas el trabajo, ya que eres tan sabio deberás saber que existen muchas maneras de hacer las cosas así como opciones. En fin, que puedes pasar mi pregunta de largo y no responder
Yo por mi parte a este foro no entro más. No es el único ni mucho menos.
Es una lastima que te pese tanto enseñar pues lo haces bien.
Que le vaya bien.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar

Order by alfanumerico

Publicado por Leonardo Josué (400 intervenciones) el 30/01/2018 20:13:27
Por Dios... Tal parece que ahora tengo la culpa de que no puedas resolver tu problema. Lo único que he venido haciendo es tratar de ayudarte!!!

En fin, bendiciones para ti y suerte con tu trabajo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad