Ir al contenido



Foto

Ordenar numero con formato "4455-45-5544"

MySQL - PHP

  • Por favor identifícate para responder
6 respuestas en este tema

#1 xPAPUx

xPAPUx

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 09 enero 2017 - 08:05

Compañeros tengo una lista para mostrar unos código de parte numéricos, con el formato 4455-45-5544 a veces es solo 300-23-32 o 345-45, que me sucede si pongo el campo en Mysql como INT elimina todo el numeral que este después del primer - , ejemplo: 4455-45-5544 queda 4455.

 

Para poder medio organizar el campo me toco ponerlo en VARCHAR y el hace el intento de organizar pero la lista queda desordenada, y en TEXT ni hablar jajaja.

 

Mi pregunta es hay forma de organizar ese VARCHAR de forma tal que omita los - ?? para que salga de forma ordenada ya sea ASC o DESC.

 

Esta es la consulta que estoy usando ahora: SELECT * FROM numparte ORDER BY parte ASC

 

 

De ante mano gracias, por su tiempo y colaboración (y) 


  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 5.857 mensajes
  • LocationArgentina

Escrito 09 enero 2017 - 09:04

¿A que te refieres con formato 4455-45-5544?

¿Que se supone que es ese formato? ¿Una especie de máscara o Mask?

 

¿O es un ejemplo de un número y por formato te refieres a un número de 4 dígitos (máximo), guión, 2 dígitos (¿máaximo?), guión, y otros 4 dígitos más?

 

Efectivamente, la única forma de que acepte esos guiones es que sea almacenado en un campo CHAR/VARCHAR con el tamaño adecuado tanto para un máximo como el mínimo posible esperado.

Ahora bien, de hacerlo así, ordenar esa cadena ascendentemente no va a traerte buenos resultados muy posiblemente. Un texto como "322-32" es más "corto" que un "311-445". Y como así también no es lo mismo un "32-32" que un "3232". No al menos de la forma tradicional.

 

Deberás definir tu criterio de ordenación y posiblemente implementar tu propio algoritmo, lo que hará que debas descartar hacerlo por la via SQL y realizarlo por la vía sistema.

 

Lo bueno, es que hacerlo por sistema no es tan malo... La clase TList cuenta con el método SortList() que recibe como parámetro una función de comparación y podemos aprovecharlo para definir nuestro propio criterio de ordenación. Básicamente lo que nos está pidiendo es el puntero a una función que regrese 3 posibles valores: -1, 0 (cero) o 1.

-1 es para indicar cuando el elemento a la izquierda es el mayor.

0 cuando los elementos a comparar son iguales.

1 para cuando el elemento a la derecha es el mayor.

 

Tu implementarás algo así:


delphi
  1. function ComparePhoneNumber(Phone1, Phone2: string): integer;
  2. begin
  3. // aquí todo lo que sea necesario para llevar la lógica adecuada
  4. end;

Y luego al hacer algo como:


delphi
  1. lista.SortList(ComparePhoneNumber);

Siendo Lista del tipo TList, aplicará el algoritmo de ordenamiento QuickSort y utilizará como criterio de ordenación tu función para dedidir el "orden" de cada uno.

 

Otra posibilidad es que al momento de guardar los números a la cadena ingresa la formatees para eliminar los guiones y concatenar los números. De esa forma ahora tendrás solamente un número y un ORDER BY ASC los pondrá en orden, ahora bien... esto no garantizará de que efectivamente esta ordenación natural numérica sea también lo que esperas. Naturalmente, al haber eliminado los guiones se pierde el sentido de los "grupos". Una manera de arreglarlo, es que no sólo guardes el número en formato numérico (sin los guiones) sino que adicionalmente dispongas de unos campos en los que guardes como están o deberían agruparse. Por ejemplo si siempre son 3 grupos pero que no siempre son de x cantidad fija de dígitos (pero si que exista un máximo) puedes disponer de 3 campos numéricos que almacenen la cantidad de dígitos. Y así por ejemplo una lectura 4,2,2 indicará que el número es xxxx-xx-xx

Y un 3,2,0 será xxx-xx.

Gracias a esos campos adicionales puedes recomponer el número al momento de mostrarlo, aprovechando funciones de concatenamiento.

 

Espero que se entienda la idea.

Creo que con estos tips se te pueden hacer algunas otras ideas. Hasta nada impide que pueda ser válido combinar estas 2 formas que te he presentado ;)

 

Saludos,


  • 0

#3 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 702 mensajes
  • LocationArgentina

Escrito 10 enero 2017 - 12:33

Y como se ordenan estos "números"?

Escribí acá o en papel 5 de esos números ordenados y que criterio usaste
  • 0

#4 xPAPUx

xPAPUx

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 10 enero 2017 - 07:35

Compañeros, la idea de organizarlos fuera del SQL, la voy a ensayar. les dejo mas información.

 

Esta es la consulta que realizo actualmente para crear posteriormente la lista de opciones:


php
  1. <?php require_once('../Connections/db.php');
  2.  
  3. $listaPartes = "SELECT * FROM numparte ORDER BY parte ASC";
  4. $listPar = mysqli_query($conx, $listaPartes);
  5. $listaP = mysqli_fetch_array($listPar);
  6.  
  7. do{
  8. echo "<option value='".$listaP['parte']."'>".$listaP['parte']."</option>";
  9. }while($listaP = mysqli_fetch_array($listPar));
  10. ?>

Este es el campo donde inluyo la lista para que luego puedan seleccionar los datos de la lista:


php
  1. <div class="form-group">
  2. <label for="parteafectada1">1- Part Number Impacted:</label>
  3. <select class="form-control" name="parteafectada1">
  4. <option value="0">None</option>
  5. <?php include('pni.php'); ?>
  6. </select>
  7. </div>

Hasta ahí normal y funcional, el problema es que el orden de los números"" no es lógico debido al uso de guiones para separar, desconozco la razón del porque decidieron tomar ese formato, pero me pidieron organizarlos ya sea en orden ascendente o descendente después de que tenga un orden de verdad. En este enlace les dejo una copia de la tabla y las fotos de de como se ven los numeros y de como tengo configurada la tabla en SQL.

 

https://mega.nz/#F!ytd2XCJI

 

 

key = !iIgXKDQi8oweak6m7rr5dw


  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.111 mensajes
  • LocationRepública Dominicana

Escrito 10 enero 2017 - 07:46

Carga los datos en un arreglo (array) y lo ordenas con natsort.

 

Saludos.


  • 0

#6 sir.dev.a.lot

sir.dev.a.lot

    Advanced Member

  • Miembros
  • PipPipPip
  • 519 mensajes
  • Location127.0.0.1

Escrito 10 enero 2017 - 08:31

Carga los datos en un arreglo (array) y lo ordenas con natsort.

 

Saludos.

 

Fuiste mas rapido, My Friend... Te me adelantaste!

 

Saludos!


  • 0

#7 xPAPUx

xPAPUx

    Member

  • Miembros
  • PipPip
  • 13 mensajes

Escrito 11 enero 2017 - 09:16

Señores mil gracias estoy experimentando e implementando. son unos MASTERS!! :ap:


  • 0