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

Como mostrar los datos de esta query

Estas en el tema de Como mostrar los datos de esta query en el foro de Mysql en Foros del Web. Hola como estan? Tengo un problema con una consulta a la base de datos y como mostrar los datos. El tema es que tengo dos ...
  #1 (permalink)  
Antiguo 18/07/2012, 08:33
 
Fecha de Ingreso: junio-2010
Mensajes: 153
Antigüedad: 13 años, 10 meses
Puntos: 4
Como mostrar los datos de esta query

Hola como estan?

Tengo un problema con una consulta a la base de datos y como mostrar los datos.
El tema es que tengo dos tablas una con posts de usuarios (titulo, texto, id_post, cantidad_votos) y en otra los usuarios que votaron cada post (id_post_votado, id_us_voto).
Bien, el problema es que quiero traer todos los post y ademas saber que usuario voto cada post. Pero cuando tenga que mostrar los datos, como identifico que post esta votado y por que usuario?

Uso mysql y PHP. Gracias.
  #2 (permalink)  
Antiguo 18/07/2012, 09:40
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Como mostrar los datos de esta query

SELECT u.id_post, u.texto, u.titulo, v.id_us_voto FROM tablausuariospost u INNER JOIN tablavotospost v ON u.id_post = v.id_post_votado

Para traerte el nombre del usuario que vota necesitaríamos saber los nombres de los campos de esa tabla donde guardas los usuarios y con otro INNER JOIN que relacione el id_us_voto de la tabla tablavotospost con la de usuarios sería fácil traerse los nombres.
  #3 (permalink)  
Antiguo 18/07/2012, 09:54
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Como mostrar los datos de esta query

Hola mark1829:

No me queda claro qué es lo que necesitas mostrar, creo que es conveniente que nos pongas algunos datos de ejemplo de tus tablas y que a partir de estos datos nos digas qué es lo que estás esperando de salida. Por lo pronto te comento algunos detalles que conviene que nos expliques mejor:

Primero, ¿por qué tu tabla de post's tiene un campo cantidad_votos?, por el nombre podría imaginar que almacenas la cantidad de veces que se ha votado por un post, pero hay que recordar que si un campo PUEDE SER CALCULADO entonces NO DEBE APARECER EN LA TABLA. En todo caso, pasa saber los post's que han sido votados sólo deberías preguntara por aquellos donde cantidad_votos sea mayor a 0, pero te repito que esto es un mal modelo de datos.

Si entendí correctamente, cada vez que se registra un voto de un usuario sobre algún post, se registra en la tabla de VOTOS, y si estoy en lo correcto actualizas también tu tabla de post's para incrementar el número de votos. Este es un modelo erróneo de datos, para calcular el número de votos que ha recibido un post simplemente tendrías que hacer un COUNT sobre la tabla de votos. Observa este script, supongamos que tienes esta información en tus tablas

Código MySQL:
Ver original
  1. mysql> SELECT * FROM posts;
  2. +---------+--------+---------+
  3. | id_post | titulo | texto   |
  4. +---------+--------+---------+
  5. |       1 | post 1 | texto 1 |
  6. |       2 | post 2 | texto 3 |
  7. |       3 | post 3 | texto 3 |
  8. |       4 | post 4 | texto 4 |
  9. +---------+--------+---------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT * FROM votos;
  13. +----------------+------------+
  14. | id_post_votado | id_us_voto |
  15. +----------------+------------+
  16. |              1 |          1 |
  17. |              1 |          2 |
  18. |              1 |          3 |
  19. |              2 |          1 |
  20. |              3 |          2 |
  21. |              3 |          3 |
  22. +----------------+------------+
  23. 6 rows in set (0.02 sec)

De aquí podemos deducir que el post 1 ha sido votado 3 veces (por los usuarios 1, 2 y 3), el post 2 sólo ha sido votado una vez (por el usuario 1) y el post 3 ha sido votado por los usuarios 2 y 3. también podemos notar que el Post 4 NO HA SIDO VOTADO POR NINGÚN USUARIO. Con esta información podríamos calcular el número de votos para cada post así:

Código MySQL:
Ver original
  1. mysql> SELECT p.id_post, p.titulo, p.texto, COUNT(id_post_votado) total_votos
  2.     -> FROM posts p
  3.     -> LEFT JOIN votos v ON v.id_post_votado = p.id_post
  4.     -> GROUP BY p.id_post, p.titulo, p.texto;
  5. +---------+--------+---------+-------------+
  6. | id_post | titulo | texto   | total_votos |
  7. +---------+--------+---------+-------------+
  8. |       1 | post 1 | texto 1 |           3 |
  9. |       2 | post 2 | texto 3 |           1 |
  10. |       3 | post 3 | texto 3 |           2 |
  11. |       4 | post 4 | texto 4 |           0 |
  12. +---------+--------+---------+-------------+
  13. 4 rows in set (0.00 sec)

Ahora nos faltaría que nos digas cómo es la estructura de tu tabla de usuarios y que nos digas qué es lo que quiere mostrar de esta información.

Dale un vistazo y nos comentas.

Saludos
Leo.
  #4 (permalink)  
Antiguo 18/07/2012, 11:06
 
Fecha de Ingreso: junio-2010
Mensajes: 153
Antigüedad: 13 años, 10 meses
Puntos: 4
Respuesta: Como mostrar los datos de esta query

leonardo_josue te respondo tus preguntas:

Cita:
Si entendí correctamente, cada vez que se registra un voto de un usuario sobre algún post, se registra en la tabla de VOTOS, y si estoy en lo correcto actualizas también tu tabla de post's para incrementar el número de votos.
Si, es tal cual decis y el modelo de las tablas tambien es igual al que detallas.

Lo que quiero hacer son dos cosas (usando tu ejemplo):

1) Supongamos que el usuario 3 entra al sitio entonces el sistema tendria que traer TODOS los post con su cantidad de votos de cada uno. Pero, yo deberia identificar que post fue votado por el usuario 3 para negarle la posibilidad de volver a votar el mismo post.

2) Ahora supongamos que entra un visitante al sitio (alguien no registrado), entonces el sistema le tiene que traer unicamente TODOS los post con la cantidad de votos de cada uno.

Espero que se entienda, sino volve a preguntarme.
  #5 (permalink)  
Antiguo 18/07/2012, 11:31
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Como mostrar los datos de esta query

Hola de nuevo mark1829:

Tienes muchas formas de obtener lo que necesitas, utilizando filtos como NOT IN, NOT EXISTS, o JOIN's... me hubiera gustado que hubieras posteado algo de lo que intentaste hacer. Aquí está una manera para hacer más o menos lo que necesitas:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   p.id_post,
  3.     ->   p.titulo,
  4.     ->   p.texto,
  5.     ->   COUNT(v.id_post_votado) total_votos,
  6.     ->   IF(v2.id_post_votado IS NULL, 'NO', 'SI') ya_votaste
  7.     -> FROM posts p
  8.     -> LEFT JOIN votos v ON v.id_post_votado = p.id_post
  9.     -> LEFT JOIN votos v2 ON v2.id_post_votado = p.id_post
  10.     ->   AND V2.id_us_voto = 1
  11.     -> GROUP BY p.id_post, p.titulo, p.texto;
  12. +---------+--------+---------+-------------+------------+
  13. | id_post | titulo | texto   | total_votos | ya_votaste |
  14. +---------+--------+---------+-------------+------------+
  15. |       1 | post 1 | texto 1 |           3 | SI         |
  16. |       2 | post 2 | texto 3 |           1 | SI         |
  17. |       3 | post 3 | texto 3 |           2 | NO         |
  18. |       4 | post 4 | texto 4 |           0 | NO         |
  19. +---------+--------+---------+-------------+------------+
  20. 4 rows in set (0.00 sec)
  21.  
  22. mysql> SELECT
  23.     ->   p.id_post,
  24.     ->   p.titulo,
  25.     ->   p.texto,
  26.     ->   COUNT(v.id_post_votado) total_votos,
  27.     ->   IF(v2.id_post_votado IS NULL, 'NO', 'SI') ya_votaste
  28.     -> FROM posts p
  29.     -> LEFT JOIN votos v ON v.id_post_votado = p.id_post
  30.     -> LEFT JOIN votos v2 ON v2.id_post_votado = p.id_post
  31.     ->   AND V2.id_us_voto = 3
  32.     -> GROUP BY p.id_post, p.titulo, p.texto;
  33. +---------+--------+---------+-------------+------------+
  34. | id_post | titulo | texto   | total_votos | ya_votaste |
  35. +---------+--------+---------+-------------+------------+
  36. |       1 | post 1 | texto 1 |           3 | SI         |
  37. |       2 | post 2 | texto 3 |           1 | NO         |
  38. |       3 | post 3 | texto 3 |           2 | SI         |
  39. |       4 | post 4 | texto 4 |           0 | NO         |
  40. +---------+--------+---------+-------------+------------+
  41. 4 rows in set (0.00 sec)

Observa que estoy generando una nueva columna llamada YA_VOTASTE, donde aparece con un SI o un NO dependiendo el caso. Probando la consulta para el usuario 1, se observa que el ya votó los post's 1 y 2, por lo tanto ya no debería poder votar nuevamente, lo mismo para el usuario 3. Observa que hago un doble LEFT JOIN sobre la tabla votos... una para considerar a todos los usuarios y otra para considerar sólo al usuario que se está analizando.

Te repito, esta no es la única manera de obtener lo que necesitas, sigue investigando un poco para que encuentres otras alternativas que pueden ser mejores a esta.

Saludos
Leo.
  #6 (permalink)  
Antiguo 18/07/2012, 11:35
 
Fecha de Ingreso: junio-2010
Mensajes: 153
Antigüedad: 13 años, 10 meses
Puntos: 4
Respuesta: Como mostrar los datos de esta query

Bueno, muchas gracias me das una idea de como es la cosa. Gracias otra vez.

Etiquetas: php, query, sql, tabla
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 21:56.