Foros del Web » Programando para Internet » PHP »

Algo parecido a Split o Explode

Estas en el tema de Algo parecido a Split o Explode en el foro de PHP en Foros del Web. Tengo que ordenar unos registros de una base de datos en funcion a un campo, pero que es incremental pero solo los 4 digitos de ...
  #1 (permalink)  
Antiguo 24/05/2004, 06:26
 
Fecha de Ingreso: mayo-2004
Ubicación: España
Mensajes: 38
Antigüedad: 13 años, 6 meses
Puntos: 0
Algo parecido a Split o Explode

Tengo que ordenar unos registros de una base de datos en funcion a un campo, pero que es incremental pero solo los 4 digitos de es campo, los dos ultimos son mas o menos fijos, me explico.

Tengo un campo con valores 000104, 000204,000304, etc

Yo quiero ordenar por 0001, 0002, pero la funcion explode me separa la cadena si tengo algun delimitador del estilo de un - o una /.

Existe alguna función para cortar la cadena para hacer un filtro solo por los 4 primeros digitos??

Gracias
  #2 (permalink)  
Antiguo 24/05/2004, 10:05
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Tienes las funciones de tratamiento de cadenas como:
substr()

Para quedarte con la porción de X cadena que necesites .. También tienes sus equivalentes bajo el SQL particular de tu Basee de datos (sería recomendable que lo usases directamente).

Y .. a todo esto . .ya probastes a ordernar esos campos desde SQL de tus consultas:

SELECT * FROM tabla ORDER BY campo

a ver como lo trata? (sobre todo si usas una estructura fija de esa cadena).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 24/05/2004, 15:54
 
Fecha de Ingreso: mayo-2004
Ubicación: España
Mensajes: 38
Antigüedad: 13 años, 6 meses
Puntos: 0
Una consulta ordenada por ese campo me la devuelve en este orden:
000102
000103
000104
000202
000203
000204

Me toma como un numero normal, primero el 102, luego 103...
cuando apra mi son las factura 0001 del 02 la 0001 del 03, y lo que yo necesito es las 0001 del 02 y depsues la 0002 del 02.

¿A que instrucciones en particular te refieres de MySQL?

Muchas Gracias
  #4 (permalink)  
Antiguo 24/05/2004, 16:01
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Ok .. pero .. que campo de tu BD usas? VARCHAR o numerico? (INT .. etc)

Si guardases en tu BD un INT para tu nº de factura .. con funciones como srtpad() (de PHP .. y creo que Mysql tiene equivalente) podrías mostrar el 1 como 0001 .. el 2 como 0002 .. el 303 como 0303 .. etc. Y podrías ordenar por ese campo sin problemas ya que sería numérico ... no string (cadena, alfanumérico).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 24/05/2004, 16:05
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Por cierto . .Msyql tiene el "Zerofill" que indica que ese tipo de dato INT (o similar numérico) se le añadiran tus ceros para completar tu mascara ..

Revisalo en:
http://dev.mysql.com/doc/mysql/en/Nu..._overview.html

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #6 (permalink)  
Antiguo 24/05/2004, 16:52
 
Fecha de Ingreso: mayo-2004
Ubicación: España
Mensajes: 38
Antigüedad: 13 años, 6 meses
Puntos: 0
El campo es Char(), ya que así me lo creo al importarlo de access. Ahora que pienso deberia ser num.

De todas formas muchas gracias ya he encontrado la solucion buscando funciones para tratar cadenas en mysql.

Esta es la sentencia

$sql="SELECT `IDFACTURA`,`NFACTURA`,`CODIGOCLIENTE`,DATE_FORMAT (FECHAFACTURA,'%d-%m-%y'),DATE_FORMAT(FECHACOBRO,'%d-%m-%y'), SUBSTRING(nfactura,1,4) AS num FROM $tabla WHERE SUBSTRING(nfactura,5)=04 order by num desc LIMIT $limite1,$limite2";

Con SUBSTRING(nfactura,1,4) consigo que me muestre los cuatro primeros caracteres, para luego tambien poder ordenarlos por esos valores y con SUBSTRING(nfactura,5)=04 filtro solo los que los ultimos valores de la cadena sean 04.

Osa ordeno inversamente solo las facturas de 2004, para así ver cual fue la ultima que se asignó.

Este es el resultado de la consulta:


NFACTURA CODIGOCLIENTE DATE_FORMAT(FECHAFACTURA,'%d-%m-%y') num
012104 19200504E 22-05-04 0121
012004 18960504M 12-05-04 0120
011004 18990504E 25-04-04 0110
010904 18950504C 06-04-04 0109
010804 18920404C 13-04-04 0108

Como verán muestro en el orden deseado ordenando por la substring num.

Obejetivo conseguido

P.D.: Este pos creo que pertenece más a Bases de datos que a PHP ya que la solución al da MySQL y no PHP.
  #7 (permalink)  
Antiguo 25/05/2004, 07:23
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
El campo es Char(), ya que así me lo creo al importarlo de access. Ahora que pienso deberia ser num.
Podrías cambiar el tipo de dato para ese campo dejando un INT o similar con la opción "zerofill" y de tamaño igual al CHAR() que ahora tienes definido .. (si tienes tiempo pruebalo .. así ahorraras todo el proceso SQL extra de SUBSTRING() ...)

Cita:
P.D.: Este pos creo que pertenece más a Bases de datos que a PHP ya que la solución al da MySQL y no PHP
Así es .. como has visto a lo largo del mensaje .. la solución podría haber sido por PHP .. pero más optimo y completo por SQL.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:45.