elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  Ordenar registros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ordenar registros  (Leído 3,301 veces)
дٳŦ٭
GNU/Linux Infrastructure Specialist
Ex-Staff
*
Desconectado Desconectado

Mensajes: 5.110


Ver Perfil WWW
Ordenar registros
« en: 13 Julio 2009, 19:41 pm »

Hola PHPecheros,

Tengo una duda, que más que duda siento es error de lógica:

Tengo una tabla "banner":

Código:
mysql> describe banner;
+---------------+------------------+------+-----+---------+----------------+
| Field         | Type             | Null | Key | Default | Extra          |
+---------------+------------------+------+-----+---------+----------------+
| id_banner     | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| nombre        | varchar(45)      | YES  |     | NULL    |                |
| archivo       | varchar(200)     | YES  |     | NULL    |                |
| thumbnail     | varchar(200)     | YES  |     | NULL    |                |
| ventana_nueva | tinyint(1)       | YES  |     | NULL    |                |
| url           | varchar(255)     | YES  |     | NULL    |                |
| activo        | tinyint(1)       | YES  |     | 1       |                |
| borrado       | tinyint(1)       | YES  |     | 0       |                |
| altura        | int(11)          | NO   |     |         |                |
| anchura       | int(11)          | NO   |     |         |                |
| defront       | tinyint(1)       | NO   |     |         |                |
| slot          | int(10) unsigned | NO   | UNI |         |                |
+---------------+------------------+------+-----+---------+----------------+
12 rows in set (0.00 sec)

En donde verán un campo llamado slot(int) que sirve para almacenar de 1 a N (sin que se repitan), esto se hace para ordenar de forma visual mis registros. La duda radica es cómo hacer un manager para controlar el orden.

Lo que hice fue hacer una lista con un par de flechas por cada registro, si es el slot==1 no pongo la flecha hacia "arriba", y de igual forma si es el último slot no pongo la que apunta hacia abajo.

La funcionalidad de "subir" ya quedó OK, sin embargo la bajada nop..  :-\

Los parámetros que mando por cada registro en el link son:

Código:
order=down&id_banner=1&slot=1&idnextslot=2

Donde id_banner es el ID del registro, el slot es el número de slot que tiene y el idnextslot es el slot siguiente.

En mis querys tengo lo siguiente:

Código
  1. //--------------------------------------------------------------+
  2. // Case Down |
  3. //--------------------------------------------------------------+
  4. if($var['order']=="down"){
  5. //--------------------------------------------------------------+
  6. // First get the next Number ID slot and ID_banner |
  7. //--------------------------------------------------------------+
  8. $DBQuery->attrib['query'] = "SELECT id_banner, slot FROM `banner` WHERE `id_banner` ='".$var['idnextslot']."'";
  9. //echo $DBQuery->attrib['query']."<br>";
  10. $getNextSlot = $DBQuery->RunQuery();
  11.  
  12. //--------------------------------------------------------------+
  13. // Update the original entry with the new id_slot |
  14. //--------------------------------------------------------------+
  15. $DBQuery->attrib['query'] = "UPDATE `banner` SET `slot` = '".$var['idnextslot']."' WHERE `id_banner` ='".$var['id_banner']."'";
  16. //echo $DBQuery->attrib['query']."<br>";
  17. $downSlot=$DBQuery->RunQuery();
  18.  
  19. //--------------------------------------------------------------+
  20. // Update the entry target with the old slot |
  21. //--------------------------------------------------------------+
  22. $DBQuery->attrib['query'] = "UPDATE `banner` SET `slot` = '".$var['slot']."' WHERE `id_banner` ='".$getNextSlot[0]['id_banner']."'";
  23. //echo $DBQuery->attrib['query']."<br>";
  24. $downSlot=$DBQuery->RunQuery();
  25.  
  26. }
  27.  

Simplemente no funciona.. me actualiza los registros mal  :xD  :-\, me pone slot's elevados y a veces menores. A ver si me podeis echar un cable.. gracias  :)


En línea

дٳŦ٭
GNU/Linux Infrastructure Specialist
Ex-Staff
*
Desconectado Desconectado

Mensajes: 5.110


Ver Perfil WWW
Re: Ordenar registros
« Respuesta #1 en: 13 Julio 2009, 20:05 pm »

Ya pude xDDDD

Se los dejo por si lo llegan a usar:

Código
  1. <?php
  2. //--------------------------------------------------------------+
  3. // Include module settings |
  4. //--------------------------------------------------------------+
  5. require_once("settings.php");
  6. //--------------------------------------------------------------+
  7. // Case Up |
  8. //--------------------------------------------------------------+
  9. if($var['order']=="up"){
  10. //--------------------------------------------------------------+
  11. // First get the pre Number ID slot |
  12. //--------------------------------------------------------------+
  13. $DBQuery->attrib['query'] = "SELECT slot FROM `banner` WHERE `id_banner` ='".$var['idpreslot']."'";
  14. //echo $DBQuery->attrib['query'];
  15. $getPreSlot = $DBQuery->RunQuery();
  16.  
  17. //--------------------------------------------------------------+
  18. // Update the pre item with last number ID slot |
  19. //--------------------------------------------------------------+
  20. $DBQuery->attrib['query'] = "UPDATE `banner` SET `slot` = '".$var['slot']."' WHERE `id_banner` ='".$var['idpreslot']."'";
  21. //echo $DBQuery->attrib['query'];
  22. $upPreSlot=$DBQuery->RunQuery();
  23.  
  24. //--------------------------------------------------------------+
  25. // As finaly, update the item with pre number ID slot |
  26. //--------------------------------------------------------------+
  27. $DBQuery->attrib['query'] = "UPDATE `banner` SET `slot` = '".$getPreSlot[0]['slot']."' WHERE `id_banner` ='".$var['id_banner']."'";
  28. //echo $DBQuery->attrib['query'];
  29. $upSlot=$DBQuery->RunQuery();
  30. }
  31. //--------------------------------------------------------------+
  32. // Case Down |
  33. //--------------------------------------------------------------+
  34. if($var['order']=="down"){
  35. //--------------------------------------------------------------+
  36. // First get the next Number ID slot and ID_banner |
  37. //--------------------------------------------------------------+
  38. $DBQuery->attrib['query'] = "SELECT id_banner, slot FROM `banner` WHERE `slot` ='".$var['idnextslot']."'";
  39. //echo $DBQuery->attrib['query']."<br>";
  40. $getNextSlot = $DBQuery->RunQuery();
  41.  
  42. //--------------------------------------------------------------+
  43. // Update the original entry with the new id_slot |
  44. //--------------------------------------------------------------+
  45. $DBQuery->attrib['query'] = "UPDATE `banner` SET `slot` = '".$var['idnextslot']."' WHERE `id_banner` ='".$var['id_banner']."'";
  46. //echo $DBQuery->attrib['query']."<br>";
  47. $downSlot=$DBQuery->RunQuery();
  48.  
  49. //--------------------------------------------------------------+
  50. // Update the entry target with the old slot |
  51. //--------------------------------------------------------------+
  52. $DBQuery->attrib['query'] = "UPDATE `banner` SET `slot` = '".$var['slot']."' WHERE `id_banner` ='".$getNextSlot[0]['id_banner']."'";
  53. //echo $DBQuery->attrib['query']."<br>";
  54. $downSlot=$DBQuery->RunQuery();
  55.  
  56. }
  57.  
  58. Location("index.php?action=".$lo_mod_name.".banshort");
  59. ?>
  60.  

Igual y no le entienden porque es parte de un FM que estoy haciendo pero bueno, cualquier consejo es bienvenido  :)


En línea

[u]nsigned


Desconectado Desconectado

Mensajes: 2.397

JS/Node developer


Ver Perfil WWW
Re: Ordenar registros
« Respuesta #2 en: 13 Julio 2009, 20:56 pm »

No te entendi bien..

Si lo que querias hacer era mostrar los registros en forma creciente o decreciente respecto a SLOT, no hubiera bastado con esto?:
Citar
...ORDER BY slot [ASC / DESC]


Y para decidir si poner la flecha o no, y si para arriba o para abajo usar algo del tipo:
Código
  1. $cont = mysql_num_rows($result);
  2. $control = $cont;
  3. while(mysql_fetch_assoc($result)
  4. {
  5.   /*printar demas datos del registro*/
  6.   if($cont == $control)///motrar solo flecha arriba
  7.   elseif($cont > $control && $control >0)//mostrar amabas
  8.   else //mostrar solo flecha abajo
  9.   $control--;
  10.  
  11. }

Y asi lo unico que cambias es la QUERY (de hecho solo una parte de ella) y te ahorras de codear dos veces basicamente lo mismo?  :huh: claro que mi ejemlo deberia adaptarse al trabajo en POO y a tu FM..

Saludos
En línea

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!
дٳŦ٭
GNU/Linux Infrastructure Specialist
Ex-Staff
*
Desconectado Desconectado

Mensajes: 5.110


Ver Perfil WWW
Re: Ordenar registros
« Respuesta #3 en: 13 Julio 2009, 23:43 pm »

Citar
Si lo que querias hacer era mostrar los registros en forma creciente o decreciente respecto a SLOT, no hubiera bastado con esto?:

mmm sí, ahí no tengo problema.

El problema es por la lógica que hago en los querys.. un amigo me dice que primero dependiendo de el lado (arriba o abajo) revisar si hay registros con ese numero de slot, traerlo y borrarlo, después mover el que quieres subir, osea editar su # de slot y añades el anterior slot en la posicion de el seleccionado.

Saludos.
En línea

^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: Ordenar registros
« Respuesta #4 en: 24 Julio 2009, 17:37 pm »

Esta super :)

usar oder by sin ninguna condicion por defecto se coloca el orden de registro ascendente. Ahora en relacion a la estructura de tu tabla (Que no digo que este mal) solo en tu caso no estas utilizando ninguna de las formas de normalizacion que implica diseno de tabla (Pero obviare esa parte eres un desarrollador no un DBA)

pero de consejo seria recomendable al menos usar la forma de normalizacion numero uno, no dejes registros con valores nulos por defecto esto relantiza la busquedad en las tablas a la hora de consultas   ;) las DB relacionales guardan direccion en memoria para un tipo de dato primitivo (int, char, varchar, decimal, etc...) sin embargo NULL no pertenece a un tipo de dato del cual se reservo espacio para el... Asigna un valor por default a cada registro en caso que vayan a dejar nulos.

Varchar(255)... bueno es lo estandar, pero recuerda que varchar guarda datos texto de tamano variable.. imagina que de esos 255 solo se inserte 80 caracteres en 1 registro, luego en la segunda insercion 125 caracteres, luego en otra insercion 200 caracteres.... al varchar ser de tamano variable quedan registros de distintos tamanos reservados en memoria, sin embargo datos tipo char de 255 insertas data de 80, 20, 200 caracteres y el resto es rellenado de ceros :) por ende le saca ventaja al espacio asignado, y es mas optimizado y estable char que varchar.. pero para gustos.

En línea

дٳŦ٭
GNU/Linux Infrastructure Specialist
Ex-Staff
*
Desconectado Desconectado

Mensajes: 5.110


Ver Perfil WWW
Re: Ordenar registros
« Respuesta #5 en: 24 Julio 2009, 20:16 pm »

Esta super :)

usar oder by sin ninguna condicion por defecto se coloca el orden de registro ascendente. Ahora en relacion a la estructura de tu tabla (Que no digo que este mal) solo en tu caso no estas utilizando ninguna de las formas de normalizacion que implica diseno de tabla (Pero obviare esa parte eres un desarrollador no un DBA)

pero de consejo seria recomendable al menos usar la forma de normalizacion numero uno, no dejes registros con valores nulos por defecto esto relantiza la busquedad en las tablas a la hora de consultas   ;) las DB relacionales guardan direccion en memoria para un tipo de dato primitivo (int, char, varchar, decimal, etc...) sin embargo NULL no pertenece a un tipo de dato del cual se reservo espacio para el... Asigna un valor por default a cada registro en caso que vayan a dejar nulos.

Varchar(255)... bueno es lo estandar, pero recuerda que varchar guarda datos texto de tamano variable.. imagina que de esos 255 solo se inserte 80 caracteres en 1 registro, luego en la segunda insercion 125 caracteres, luego en otra insercion 200 caracteres.... al varchar ser de tamano variable quedan registros de distintos tamanos reservados en memoria, sin embargo datos tipo char de 255 insertas data de 80, 20, 200 caracteres y el resto es rellenado de ceros :) por ende le saca ventaja al espacio asignado, y es mas optimizado y estable char que varchar.. pero para gustos.



En efecto, tienes toda la razón corazón  :), ya las he cambiado. Saludos
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ordenar reguistros
Programación C/C++
mapers 2 2,949 Último mensaje 15 Enero 2011, 18:32 pm
por N0body
Ordenar un HashMaps
Java
mapers 0 1,767 Último mensaje 8 Septiembre 2012, 19:55 pm
por mapers
ordenar registros, mostrar más reciente a más viejo
Bases de Datos
basickdagger 6 7,562 Último mensaje 22 Junio 2016, 08:25 am
por Pedro Ivan
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines