Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Intercalar resultados de consultas a mysql o usar php

Estas en el tema de Intercalar resultados de consultas a mysql o usar php en el foro de Mysql en Foros del Web. EStimados tengo una consulta. Quiero mostrar en mi web los comentarios y post de UN SOLO USUARIO, solo como titulares, una especie de lista . ...
  #1 (permalink)  
Antiguo 29/10/2011, 15:36
 
Fecha de Ingreso: junio-2011
Ubicación: Argentina
Mensajes: 32
Antigüedad: 12 años, 10 meses
Puntos: 2
Información Intercalar resultados de consultas a mysql o usar php

EStimados tengo una consulta.
Quiero mostrar en mi web los comentarios y post de UN SOLO USUARIO, solo como titulares, una especie de lista . Por ejemplo:
.Juan comentó el post XXXXX
.Juan creo el post YYYYYY
.Juan creo el post IIIIII

Esto quiero que se muestre ordenado temporalmente, es decir que tanto los titulares de comentarios y de los posteos se muestren ordenados
temporalmente, lo que implica que van a aparecer intercalados titulares de comentarios y titulares de posteos ordenados cronologicamente.
Mi consulta es la siguiente: como hacer esto?
Tengo los comentarios, los post y los usuarios por tablas separadas.
Me vienen varias cosas a la mente:
- Algo como hacer consultas separadas a mysql por un lado para los comentarios y otra para los post y por medio de alguna funcion
de php que me intercale y ordene los resultados de las consultas.
- o hacer consultas a la base de datos con alguna funcion que me organice los datos de la forma que quiero (vi algo como UNION ALL).

Se puede hacer alguna de estas dos cosas? Si ambas se pueden cual combiene? Que funciones usar? Existe otra forma mejor?
Desde ya muchas gracias.
  #2 (permalink)  
Antiguo 31/10/2011, 09:30
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Intercalar resultados de consultas a mysql o usar php

Hola srnetworks:

Tal como lo infieres correctamente, una opción sería utilizar UNION para unir las dos tablas, sin embargo olvidaste mencionarnos cuál es la estructura de tus tablas, para poder darte un ejemplo más cercano a tu realidad. Sin embargo creo que este script podría servirte:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE TablaUsuarios (idUsuario INT, nombre VARCHAR(15));
  2. Query OK, 0 rows affected (0.14 sec)
  3. mysql> INSERT INTO TablaUsuarios VALUES (1, 'Juan');
  4. Query OK, 1 row affected (0.03 sec)
  5. mysql> SELECT * FROM TablaUsuarios;
  6. +-----------+--------+
  7. | idUsuario | nombre |
  8. +-----------+--------+
  9. |         1 | Juan   |
  10. +-----------+--------+
  11. 1 row in set (0.00 sec)
  12. mysql> CREATE TABLE TablaPosts (idPost INT, idUsuario INT,
  13.     -> descripcion VARCHAR(20), fecha DATETIME);
  14. Query OK, 0 rows affected (0.09 sec)
  15. mysql> INSERT INTO TablaPosts VALUES
  16.     -> (1, 1, 'Prueba 1', '2011-10-30 14:33:21'),
  17.     -> (2, 1, 'Prueba 2', '2011-10-31 09:21:32');
  18. Query OK, 2 rows affected (0.03 sec)
  19. Records: 2  Duplicates: 0  Warnings: 0
  20. mysql> SELECT * FROM TablaPosts;
  21. +--------+-----------+-------------+---------------------+
  22. | idPost | idUsuario | descripcion | fecha               |
  23. +--------+-----------+-------------+---------------------+
  24. |      1 |         1 | Prueba 1    | 2011-10-30 14:33:21 |
  25. |      2 |         1 | Prueba 2    | 2011-10-31 09:21:32 |
  26. +--------+-----------+-------------+---------------------+
  27. 2 rows in set (0.00 sec)
  28. mysql> CREATE TABLE TablaComentarios (idComentario INT,
  29.     -> idUsuario INT, idPost INT, descripcion VARCHAR(40),
  30.     -> fecha DATETIME);
  31. Query OK, 0 rows affected (0.11 sec)
  32. mysql> INSERT INTO TablaComentarios VALUES
  33.     -> (1, 1, 1, 'Comentario 1 del Post 1', '2011-10-30 14:35:32'),
  34.     -> (2, 1, 1, 'Comentario 2 del Post 1', '2011-10-31 10:45:41'),
  35.     -> (3, 1, 2, 'Comentario 1 del Post 2', '2011-10-31 10:48:09');
  36. Query OK, 3 rows affected (0.03 sec)
  37. Records: 3  Duplicates: 0  Warnings: 0
  38. mysql> SELECT TP.fecha,
  39.     -> CONCAT(Tu.nombre, ' creó el post ', TP.descripcion) descripcion
  40.     -> FROM TablaUsuarios TU INNER JOIN TablaPosts TP ON
  41.     -> TU.idUsuario = TP.idUsuario
  42.     -> UNION ALL
  43.     -> SELECT TC.fecha,
  44.     -> CONCAT(Tu.nombre, ' comentó el post ', TP.descripcion) descripcion
  45.     -> FROM TablaUsuarios TU
  46.     -> INNER JOIN TablaPosts TP ON TU.idUsuario = TP.idUsuario
  47.     -> INNER JOIN TablaComentarios TC ON
  48.     -> TU.idUsuario = TC.idUsuario
  49.     -> AND TP.idPost = TC.idPost
  50.     -> ORDER BY 1;
  51. +---------------------+-------------------------------+
  52. | fecha               | descripcion                   |
  53. +---------------------+-------------------------------+
  54. | 2011-10-30 14:33:21 | Juan creó el post Prueba 1    |
  55. | 2011-10-30 14:35:32 | Juan comentó el post Prueba 1 |
  56. | 2011-10-31 09:21:32 | Juan creó el post Prueba 2    |
  57. | 2011-10-31 10:45:41 | Juan comentó el post Prueba 1 |
  58. | 2011-10-31 10:48:09 | Juan comentó el post Prueba 2 |
  59. +---------------------+-------------------------------+
  60. 5 rows in set (0.01 sec)

Observa que la última consulta está compuesta de dos subconsultas... son prácticamente iguales, pero en la segunda se hacen los JOINS sobre las tres tablas. Observa también que en la primer subconsulta se toma la fecha de la tabla de Posts (SELECT TP.fecha) mientras que en la segunda subconsulta se toma la fecha de la tabla de comentarios (SELECT TC.fecha). Finalmente, la intercalación se da al ordenar los registros por fecha...

En los datos de ejemplo pongo a propósito un comentario del post1 en una fecha posterior al día de creación... si quisieras mostrar todos los mensajes referentes a un post, tendrías que hacer algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT TP.fecha, TP.idPost,
  2.     -> CONCAT(Tu.nombre, ' creó el post ', TP.descripcion) descripcion
  3.     -> FROM TablaUsuarios TU INNER JOIN TablaPosts TP ON
  4.     -> TU.idUsuario = TP.idUsuario
  5.     -> UNION ALL
  6.     -> SELECT TC.fecha, TP.idPost,
  7.     -> CONCAT(Tu.nombre, ' comentó el post ', TP.descripcion) descripcion
  8.     -> FROM TablaUsuarios TU
  9.     -> INNER JOIN TablaPosts TP ON TU.idUsuario = TP.idUsuario
  10.     -> INNER JOIN TablaComentarios TC ON
  11.     -> TU.idUsuario = TC.idUsuario
  12.     -> AND TP.idPost = TC.idPost
  13.     -> ORDER BY 2,1;
  14. +---------------------+--------+-------------------------------+
  15. | fecha               | idPost | descripcion                   |
  16. +---------------------+--------+-------------------------------+
  17. | 2011-10-30 14:33:21 |      1 | Juan creó el post Prueba 1    |
  18. | 2011-10-30 14:35:32 |      1 | Juan comentó el post Prueba 1 |
  19. | 2011-10-31 10:45:41 |      1 | Juan comentó el post Prueba 1 |
  20. | 2011-10-31 09:21:32 |      2 | Juan creó el post Prueba 2    |
  21. | 2011-10-31 10:48:09 |      2 | Juan comentó el post Prueba 2 |
  22. +---------------------+--------+-------------------------------+
  23. 5 rows in set (0.00 sec)

Dale un vistazo y nos comentas.

Saludos
Leo.
  #3 (permalink)  
Antiguo 21/11/2011, 21:24
 
Fecha de Ingreso: junio-2011
Ubicación: Argentina
Mensajes: 32
Antigüedad: 12 años, 10 meses
Puntos: 2
Respuesta: Intercalar resultados de consultas a mysql o usar php

EStimado gracias por la respuesta, recien la veo.. lo pruebo y te comento..
  #4 (permalink)  
Antiguo 10/12/2011, 15:06
 
Fecha de Ingreso: junio-2011
Ubicación: Argentina
Mensajes: 32
Antigüedad: 12 años, 10 meses
Puntos: 2
Respuesta: Intercalar resultados de consultas a mysql o usar php

Estimado he probado lo que me dices esta muy bueno, obtengo lo que queria de una manera simple. Pero lo que con eso queria era obtener los datos y despues pasarlos a php y darles formato de la siguiente manera.
Por ejemplo:
Quiero que en la pagina web se vea asi:
Juan creó el post Prueba 1
Con mysql trabajo los datos y con php los llamo y despues con html la idea es darle formato de manera que queden sombreados y subrallados el nombre y el post, y que a su vez estas palabras sean un hipervínculo al perfil del usuario y a la direccion donde se encuentra el post.
Es decir que al hacer click sobre Juan me lleve a su peril de usuario y al hacer click sobre post Prueba 1 me lleve a la direccion del post.

Creo que de la manera que quiero mostrar la info habria que obtener los datos de otra forma para que pueda darles formato. Es asi?
Se me ocurre algo con lo que hiciste, con el codigo que me pasaste obtengo esto:
Código MySQL:
Ver original
  1. +---------------------+--------+-------------------------------+
  2. | fecha               | idPost | descripcion                   |
  3. +---------------------+--------+-------------------------------+
  4. | 2011-10-30 14:33:21 |      1 | Juan creó el post Prueba 1    |
  5. | 2011-10-30 14:35:32 |      1 | Juan comentó el post Prueba 1 |
  6. | 2011-10-31 10:45:41 |      1 | Juan comentó el post Prueba 1 |
  7. | 2011-10-31 09:21:32 |      2 | Juan creó el post Prueba 2    |
  8. | 2011-10-31 10:48:09 |      2 | Juan comentó el post Prueba 2 |
  9. +---------------------+--------+-------------------------------+
Se me ocurre de obtener por php los datos por filas, convertir los datos de la fila en array y darle formato a cada elemento. Es decir uso mysql_fetch_array descompongo y le doy formato a cada elemento de la fila y le aplico un loop para que se haga esto hasta el final. Puede ser? O hay otra forma de hacer esto menos complicada?
Desde ya muchas gracias
  #5 (permalink)  
Antiguo 13/12/2011, 13:50
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Intercalar resultados de consultas a mysql o usar php

Hola de nuevo:

No tengo conocimientos en PHP, ya que trabajo con JAVA y .net, pero creo que estás complicando de más, en lugar de concatenar el resultado como lo estoy poniendo en el ejemplo puedes obtener los datos de manera separada:

Código MySQL:
Ver original
  1. mysql> SELECT TP.fecha,
  2.     -> TU.nombre, ' creó el post ' accion, TP.descripcion
  3.     -> FROM TablaUsuarios TU INNER JOIN TablaPosts TP ON
  4.     -> TU.idUsuario = TP.idUsuario
  5.     -> UNION ALL
  6.     -> SELECT TC.fecha,
  7.     -> TU.nombre, ' comentó el post ' accion, TP.descripcion
  8.     -> FROM TablaUsuarios TU
  9.     -> INNER JOIN TablaPosts TP ON TU.idUsuario = TP.idUsuario
  10.     -> INNER JOIN TablaComentarios TC ON
  11.     -> TU.idUsuario = TC.idUsuario
  12.     -> AND TP.idPost = TC.idPost
  13.     -> ORDER BY 1;
  14. +---------------------+--------+-------------------+-------------+
  15. | fecha               | nombre | accion            | descripcion |
  16. +---------------------+--------+-------------------+-------------+
  17. | 2011-10-30 14:33:21 | Juan   |  creó el post     | Prueba 1    |
  18. | 2011-10-30 14:35:32 | Juan   |  comentó el post  | Prueba 1    |
  19. | 2011-10-31 09:21:32 | Juan   |  creó el post     | Prueba 2    |
  20. | 2011-10-31 10:45:41 | Juan   |  comentó el post  | Prueba 1    |
  21. | 2011-10-31 10:48:09 | Juan   |  comentó el post  | Prueba 2    |
  22. +---------------------+--------+-------------------+-------------+
  23. 5 rows in set (0.02 sec)

De tal manera que en tu pagina web tengas algo como esto:

Código:
<a href="url1">Aquí recuperas el campo nombre</a> 
aquí recuperas el campo accion
<a href="url2">aquí recuperas el campo descripcion</a>
La forma en que recuperes los datos, y el ciclo para pintar todos los registros te lo dejo a tí, pues te repito que no trabajo con PHP... si continuas con problemas sería conveniente que te dirijas al foro de habilitado para consultas sobre PHP

Saludos
Leo.
  #6 (permalink)  
Antiguo 13/12/2011, 17:02
 
Fecha de Ingreso: junio-2011
Ubicación: Argentina
Mensajes: 32
Antigüedad: 12 años, 10 meses
Puntos: 2
Respuesta: Intercalar resultados de consultas a mysql o usar php

leonardo_josue si eso fue lo que hice le saque la concatenacion y despues pude hacer lo que quería
Desde ya gracias

Etiquetas: intercalarconsultas, php
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 14:10.