Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: Ari Slash en 12 Enero 2010, 19:09 pm



Título: Consulta Ultimos mensajes
Publicado por: Ari Slash en 12 Enero 2010, 19:09 pm
Buenas...

la verdad es que no se como se hace pero lo que quiero es algo asi como
lo que hay en el index del foro donde salen los ultimos 10 mensajes de los users

mi consulta es asi
Código
  1. $mensajes=mysql_query("SELECT tema,numero,usuario,fecha,hora FROM mensajes limit 10;");

obviamente los cargo con un bucle, eso todo ok.....
pero me salen los mismos mensajes siempre xD
hay alguna forma de que me tome los 10 ultimos? segun la fecha y hora?


saludos y gracias


Título: Re: Consulta Ultimos mensajes
Publicado por: N4X en 12 Enero 2010, 19:20 pm
a bote pronto diria...

Código
  1. $mensajes=mysql_query("SELECT tema,numero,usuario,fecha,hora FROM mensajes ORDER BY fecha");
  2.  

el limit 10 es para mostrar solo 10, no para ordenarlos.

saludos
nax


Título: Re: Consulta Ultimos mensajes
Publicado por: ^Tifa^ en 12 Enero 2010, 19:21 pm
Tomar los 10 ultimos siempre de todos los registros de la tabla??? se haria asi por ejemplo no seria problema, pero vas a tener que aprender a jugar con el contador  ;)  me explico, observa este ejemplo.

Tengo 8 registros en 1 campo de una tabla ejemplo:

Código
  1.  
  2. mysql> SELECT * FROM ejemplo;
  3. +---------+
  4. | palabra |
  5. +---------+
  6. | Coco    |
  7. | Mango   |
  8. | Pera    |
  9. | Uva     |
  10. | Fresa   |
  11. | Manzana |
  12. | Melon   |
  13. | Sandia  |
  14. +---------+
  15. 8 ROWS IN SET (0.02 sec)
  16.  
  17.  

Y yo quiero por ejemplo los 2 ultimos (Melon & Sandia) entonces:

Código
  1.  
  2. mysql> SELECT * FROM ejemplo LIMIT 6,8;
  3. +---------+
  4. | palabra |
  5. +---------+
  6. | Melon   |
  7. | Sandia  |
  8. +---------+
  9. 2 ROWS IN SET (0.00 sec)
  10.  
  11.  
  12.  

Ahora quiero no esos 2 ultimos sino los antepenultimos... entonces haria:

Código
  1.  
  2. mysql> SELECT * FROM ejemplo LIMIT 4,7;
  3. +---------+
  4. | palabra |
  5. +---------+
  6. | Fresa   |
  7. | Manzana |
  8. | Melon   |
  9. | Sandia  |
  10. +---------+
  11. 4 ROWS IN SET (0.00 sec)
  12.  
  13. mysql> SELECT * FROM ejemplo LIMIT 1,3;
  14. +---------+
  15. | palabra |
  16. +---------+
  17. | Mango   |
  18. | Pera    |
  19. | Uva     |
  20. +---------+
  21. 3 ROWS IN SET (0.00 sec)
  22.  
  23.  
  24.  

Vas entendiendo como va muchacho  :D  juega con tu contador o bucle  ;) para ir obteniendo los 10 ultimos y los 10 antepenultimos y asi sucesivamente.

Ahora si es solo tomar los 10 ultimos de todos los registros de la tabla 1 sola vez, pues:

SELECT * FROM TABLA ORDER BY fecha DESC LIMIT 10;


Título: Re: Consulta Ultimos mensajes
Publicado por: Ari Slash en 12 Enero 2010, 19:27 pm
gracias n4x y tifa  ;D

gracias por tu dedicacion tifa  :)

a lo que tenga el codigo lo postea aver como va, ya se me escurrieron ideas  :rolleyes:





saludos


Título: Re: Consulta Ultimos mensajes
Publicado por: ^Tifa^ en 12 Enero 2010, 19:35 pm
De nada Ari. Si es la primera opcion que te propuse lo que estas solicitando entonces si.. tienes alguito que restructurar con tu codigo y MySQL  :xD si es lo segundo propuesto por mi o N4X iras bien 1 sola linea de consulta SQL.

Un saludito  :D


Título: Re: Consulta Ultimos mensajes
Publicado por: Ari Slash en 13 Enero 2010, 04:46 am
hola

bueno no estuve toda la tarde tratando de solucionarlo xD, me salio una emergencia

lo solucione de esta manera, le agrege un atributo a los mensajes llamado correlativo, entonces los ordene por correlativo y tome los 10 ultimos

esta es mi base datos:

Citar
mensajes(tema,numero,usuario,cuerpo,fecha,hora,eliminado,correlativo)
temas(id,nombre)
usuarios(nick,password,email,fecha_registro,privilegio)

y este es el codigo php:

Código
  1. <?php
  2. $conexión=mysql_connect($_SESSION["host"],$_SESSION["usuario"],$_SESSION["clave"])or die ('Ha fallado la conexion: '.mysql_error());
  3. mysql_select_db($_SESSION["basedatos"])or die ('Error: '.mysql_error());
  4. $mensajes=mysql_query("SELECT * FROM mensajes;");
  5. $max=mysql_num_rows($mensajes);
  6. $min=$max-10;
  7. $mensajes=mysql_query('SELECT * FROM mensajes ORDER BY correlativo LIMIT '.$min.','.$max.';');
  8. while($fila=mysql_fetch_array($mensajes)){
  9. $tema= mysql_fetch_array(mysql_query("select nombre from temas where id=".$fila["tema"]));
  10. echo "<a href='/temas.php?id=".$fila["tema"];
  11. echo "'>Mensaje en ".$tema["nombre"]." por ".$fila["usuario"]." [".$fila["hora"]." / ".$fila["fecha"]."]";
  12. echo "</a><br>";
  13. }
  14. mysql_close($conexión);
  15. ?>
  16.  


fue una mezcla de las dos soluciones xD

ahora me toca probarlo xD, ya que debo modificar mi base de datos  :xD

que opinas tifa?


saludos



Título: Re: Consulta Ultimos mensajes
Publicado por: ^Tifa^ en 13 Enero 2010, 05:05 am
No se PHP  ;D

Pero tratando de interpretar tu codigo (si funciona) esto:

Código
  1. $min=$max-10;
  2. $mensajes=mysql_query('SELECT * FROM mensajes ORDER BY correlativo LIMIT '.$min.','.$max.';');
  3. while($fila=mysql_fetch_array($mensajes)){
  4.  
  5.  

Deberia hacer justamente lo que te especifique en el paso 1 de mi ejemplo, que seria seleccionar todos los registros de la tabla (Supongamos que en total tienes 200 registros) los cuales se le asigna el valor a la variable $max y la variable $min = $max-10 por lo cual los datos a mostrar irian reduciendose de 10 en 10  ;)

Aun desconozco si quieres captar la data desde el final de todos los registros o desde el inicio. Pero si utilizas el ORDER BY sin especificarle ascendiente o descendiente, por defecto el utiliza Ascendiente.  ;)

Me avisas cuando pruebes tu codigo.

PD: Se me olvidaba, ten pendiente que los registros dentro de los campos de las tablas son contados por LIMIT como en programacion accesamos a indices de un arreglo. Digase que el primer registro de una tabla se accede a el mediante 0, no comienza en 1 sino en 0

Saludos.


Título: Re: Consulta Ultimos mensajes
Publicado por: Ari Slash en 13 Enero 2010, 08:39 am
ya tifa ya lo probe...tuve que hacer unas modificaciones pero funciono  ;D

aqui el codigo arreglado, lo tuve que reparar porque se me habia olvidado que si hay menos de 10 mensajes en el "foro", saldria error hasta que hubiesen 11  :xD
y ademas le agrege la propiedad auto_increment al atributo correlativo para que fuese automatico...

Código
  1. <br>
  2. Ultimos mensajes:
  3. <br>
  4. <?php
  5. $conexion=mysql_connect($_SESSION["host"],$_SESSION["usuario"],$_SESSION["clave"])or die ('Ha fallado la conexion: '.mysql_error());
  6. mysql_select_db($_SESSION["basedatos"])or die ('Error al seleccionar la Base de Datos: '.mysql_error()); //datos de conexión
  7. $mensajes=mysql_query('SELECT * FROM mensajes'); //consultando total mensajes
  8. $max=mysql_num_rows($mensajes); //pasando el numero de filas del array a entero
  9. if($max<=10){
  10. $min=0; //si hay menos o igual de 10 el menor a mostrar sera el 1
  11. } else {
  12. $min=$max-10; //si hay mas de 10, se restan 10 al max
  13. }
  14. $max=10; //el maximo se establece en 10 a partir del min
  15. $mensajes=mysql_query('SELECT tema,usuario,hora,fecha FROM mensajes ORDER BY correlativo LIMIT '.$min.','.$max.''); //se consulta por los 10 ultimos mensajes
  16. while($fila=mysql_fetch_array($mensajes)){ //ciclo que generara el html
  17. $tema= mysql_fetch_array(mysql_query('select nombre from temas where id='.$fila["tema"].''));
  18. echo "<a href='/temas.php?id=".$fila["tema"];
  19. echo "'>Mensaje en ".$tema["nombre"]." por ".$fila["usuario"]." [".$fila["hora"]." / ".$fila["fecha"]."]";
  20. echo "</a><br>";
  21. }
  22. mysql_close($conexion); //cerrando la conexión
  23. ?>
  24.  

la logica que entendi del limit fue la siguiente, segun las pruebas, el primer valor es de donde se partira (este sin contarlo) y el segundo cuantos registros mas contar ascendientemente. un poco enredado pero asi lo entendi  :xD

aqui dejo unas capturas  ;D (colocale abrir vinculo en nueva ventana)

http://imgas.zxq.net/elhackernet/Mensajes1.png
http://imgas.zxq.net/elhackernet/Mensajes2.png



Nuevamente gracias  :D

ojala tuviese profesoras como tu


saludos  :)



Título: Re: Consulta Ultimos mensajes
Publicado por: ^Tifa^ en 13 Enero 2010, 18:32 pm
Me alegro sobremanera que pudieses resolver Ari  ;)

el proposito era intentar guiarte a una solucion, y me alegro que hayas dado con una.

Citar
la logica que entendi del limit fue la siguiente, segun las pruebas, el primer valor es de donde se partira (este sin contarlo) y el segundo cuantos registros mas contar ascendientemente. un poco enredado pero asi lo entendi

Digamos que efectivamente seria asi, el primer valor es de donde se parte y el segundo cuantos registros mas contar ascendientemente como dices  ;) enredado ciertamente, pero esa es la idea  ;D