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

Consulta de dos tablas se me atraganta

Estas en el tema de Consulta de dos tablas se me atraganta en el foro de Mysql en Foros del Web. Hola a todos!! Lo que estoy intentando hacer es una consulta a dos tablas, una de posts y otra de comentarios de los posts, y ...
  #1 (permalink)  
Antiguo 05/12/2012, 14:39
 
Fecha de Ingreso: octubre-2012
Mensajes: 7
Antigüedad: 11 años, 6 meses
Puntos: 0
Consulta de dos tablas se me atraganta

Hola a todos!!

Lo que estoy intentando hacer es una consulta a dos tablas, una de posts y otra de comentarios de los posts, y me gustaría obtener los datos de ambas y ordenaditos por fecha y post_id, os clarifico:

LO QUE TENGO

tabla 1 Posts


post_id - author_id - body - created_time - object_id - author_name
1 - 1215834998 - Primero -- 2012-12-01 19:13:09 -- 111812165504902 - Juanma
2 - 1215834998 - Segundo -- 2012-12-03 13:28:15 -- 111812165504902 - Juanma
3 - 1215834998 - Tercero -- 2012-12-05 20:25:53 -- 111812165504902 - Juanma
4 - 1215834998 - cuarto -- 2012-12-05 20:26:06 -- 111812165504902 - Juanma
5 - 1215834998 - quinto -- 2012-12-05 20:26:16 -- 111812165504902 - Juanma

tabla 2 Comments

post_id - fromid - text - time - username
1 - 1215834998 - primero de primero -- 2012-12-05 20:26:57 -- Juanma
2 - 1215834998 - segundo de primero -- 2012-12-05 20:27:42 -- Juanma
3 - 1215834998 - primero de segundo -- 2012-12-05 20:28:06 -- Juanma
4 - 1215834998 - primero de tercero -- 2012-12-05 20:28:36 -- Juanma

LA IDIOTEZ QUE INTENTO

Lo que estoy intentando es obtener una tabla que me devuelva todos los posts con sus respectivos comentarios, preferiblemente ordenados por fecha y esas cositas que lo hacen ma mejón

Código MySQL:
Ver original
  1. FROM postwou LEFT JOIN comment ON postwou.post_id=comment.post_id
  2. WHERE postwou.object_id=" . $object_id

LA FRICADA QUE ME DEVUELVE

[{"post_id":"1","author_id":"1215834998","body":"Pr imero","created_time":"2012-12-01 19:13:09","object_id":"","author_name":"Juanma","f romid":"1215834998","text":"Primero de primero","time":"2012-12-05 20:26:57","username":"Juanma"},

{"post_id":"1","author_id":"1215834998","body":"Pr imero","created_time":"2012-12-01 19:13:09","object_id":"","author_name":"Juanma","f romid":"1215834998","text":"segundo de primero","time":"2012-12-05 20:27:42","username":"Juanma"},

{"post_id":"2","author_id":"1215834998","body":"Se gundo","created_time":"2012-12-03 13:28:15","object_id":"","author_name":"Juanma","f romid":"1215834998","text":"primero de segundo","time":"2012-12-05 20:28:06","username":"Juanma"},

{"post_id":"3","author_id":"1215834998","body":"Te rcero","created_time":"2012-12-05 20:25:53","object_id":"","author_name":"Juanma","f romid":"1215834998","text":"primero de tercero","time":"2012-12-05 20:28:36","username":"Juanma"},

{"post_id":null,"author_id":"1215834998","body":"c uarto","created_time":"2012-12-05 20:26:06","object_id":null,"author_name":"Juanma", "fromid":null,"text":null,"time":null,"username":n ull},

{"post_id":null,"author_id":"1215834998","body":"q uinto","created_time":"2012-12-05 20:26:16","object_id":null,"author_name":"Juanma", "fromid":null,"text":null,"time":null,"username":n ull}]

(los espacios frikies de pr imero, seg undo y esos, son de este foro, en eso no tengo problema)

LO QUE NECESITO

Aquellos posts que tienen comentarios hechos viene con su post_id, son los casos del 1, 2 y 3, pero los post_id de los que no tienen comentarios no me sale casos 4 y 5


Muchas gracias a aquellos que sepan contestar a este pobre ignorante, ya se que es muy sencillo, pero es que estoy pegadisimo en SQL.

Un saludo a todos!!

Última edición por gnzsoloyo; 05/12/2012 a las 14:53 Razón: Código SQL no etiquetado.
  #2 (permalink)  
Antiguo 05/12/2012, 14:54
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta de dos tablas se me atraganta

Prueba:
Código MySQL:
Ver original
  1. FROM postwou LEFT JOIN comment ON postwou.post_id=comment.post_id
  2. WHERE postwou.object_id=$object_id OR comment.post_id  IS NULL
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 05/12/2012, 15:44
 
Fecha de Ingreso: octubre-2012
Mensajes: 7
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Consulta de dos tablas se me atraganta

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Prueba:
Código MySQL:
Ver original
  1. FROM postwou LEFT JOIN comment ON postwou.post_id=comment.post_id
  2. WHERE postwou.object_id=$object_id OR comment.post_id  IS NULL
Eso no me devolverá los dos últimos registros verdad? El caso es que los necesito también, el problema es que post_id tiene el mismo valor en las dos tablas y NECESITO que salga ese valor, cosa que no pasa.

No sé si tendrá algo que ver que sea la única columna que comparte nombre en las dos tablas y al hacer la comparación pierde el valor en donde no coinciden los post_id's, si es así, como hago para cotejar los comentarios a sus respectivos posts?

ya dije que era un poco rarito,

gracias por todo!!
  #4 (permalink)  
Antiguo 05/12/2012, 16:30
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta de dos tablas se me atraganta

Cita:
Eso no me devolverá los dos últimos registros verdad? El caso es que los necesito también, el problema es que post_id tiene el mismo valor en las dos tablas y NECESITO que salga ese valor, cosa que no pasa.
Perdón, pero... ¿probaste o simplemente estás preguntando sin intentarlo?

Prueba la consulta y luego vemos.

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 05/12/2012, 16:41
 
Fecha de Ingreso: octubre-2012
Mensajes: 7
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Consulta de dos tablas se me atraganta

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Perdón, pero... ¿probaste o simplemente estás preguntando sin intentarlo?

Prueba la consulta y luego vemos.

jajajaja dale!! me has pillao!! jajaja

lo pruebo

....

Nien!! Sigue dándome NULL nullisimo más bien, yo que sé que más probar, seguro que al final es una tontería,
el caso es que creo que tiene relación la comparación algo por el estilo, no lo llego a entender, pero también es mi nivel de sql, es bastante bajo a mi parecer...
  #6 (permalink)  
Antiguo 05/12/2012, 18:18
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta de dos tablas se me atraganta

Cita:
Nien!! Sigue dándome NULL
Es probable que o no tengas claro como funciona el tema, o no sea eso lo que realmente quieres.
Si lo que pretendes es sólo los posts que tengan comentarios, se usa INNER JOIN.
Si quieres todos los posts, tengan o no comentarios, se usa LEFT JOIN, pero eso devovlerá, como te digo NULL, en las columnas correspondientes a la segunda tabla, si el post no tiene comentarios relacionados.
Es decir, los NULL son el comportamiento esperado. Para evitar que molesten se debe invocar uno por uno los campos en el SELECT, y no usar "*".
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 06/12/2012, 03:23
 
Fecha de Ingreso: octubre-2012
Mensajes: 7
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Consulta de dos tablas se me atraganta

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Es probable que o no tengas claro como funciona el tema, o no sea eso lo que realmente quieres.

Realmente si se lo que quiero, lo que pasa que mi nivel no es muy alto y no sé que pasa.

El objetivo es que al comparar las tablas, el único campo que tiene el mismo nombre en ambas tablas, es por el que busco las coincidencias (lógico) y ese campo POST_ID si es nulo en la segunda tabla de COMMENT al juntar los resultados me aparece NULL.

Ese campo es imprescindible después al decodificar el JSON, porque así sé donde los tengo que poner, orden, etc... Lo suyo por lo tanto es que aparezcan TODOS los POST_ID sin excepción y que en esos posts en donde haya comentarios aparezca el resto de la información, si algo, por ejemplo TEXT, es NULL entonces sé que ese POST no tiene comentarios y sigo para adelante, pero como sigo para adelante?... POST_ID (1,2,3,4,5....)

Fácil.

Pero complicado si no eres un makina en sql.... como me pasa a mi!!!! jajajaja
  #8 (permalink)  
Antiguo 06/12/2012, 03:55
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta de dos tablas se me atraganta

Vamos a ver si se entiende y queda claro que lo que hace el LEFT JOIN es precisamente mosrtar las cosas como tu quieres, por lo que resulta difícil comprender cuál es tu problema...
Supongamos que tenemos estas dos tablas:
Código MySQL:
Ver original
  1. mysql> SELECT *
  2.     -> FROM posts;
  3. +----------+------+
  4. | id_posts | post |
  5. +----------+------+
  6. |        1 | post |
  7. |        2 | post |
  8. |        3 | post |
  9. |        4 | post |
  10. |        5 | post |
  11. |        6 | post |
  12. +----------+------+
  13. 6 rows in set (0.01 sec)
  14.  
  15. mysql> SELECT *
  16.     -> FROM comentarios;
  17. +----------------+----------+------------+
  18. | id_comentarios | id_posts | comentario |
  19. +----------------+----------+------------+
  20. |              1 |        2 | comentario |
  21. |              2 |        2 | comentario |
  22. |              3 |        3 | comentario |
  23. |              4 |        5 | comentario |
  24. |              5 |        4 | comentario |
  25. +----------------+----------+------------+
  26. 5 rows in set (0.00 sec)
SI yo hago un LEFT JOIN entre ambas, obtengo:
Código MySQL:
Ver original
  1. mysql> SELECT *
  2.     -> FROM posts P LEFT JOIN comentarios C ON P.id_posts = C.id_posts;
  3. +----------+------+----------------+----------+------------+
  4. | id_posts | post | id_comentarios | id_posts | comentario |
  5. +----------+------+----------------+----------+------------+
  6. |        1 | post |           NULL |     NULL | NULL       |
  7. |        2 | post |              1 |        2 | comentario |
  8. |        2 | post |              2 |        2 | comentario |
  9. |        3 | post |              3 |        3 | comentario |
  10. |        4 | post |              5 |        4 | comentario |
  11. |        5 | post |              4 |        5 | comentario |
  12. |        6 | post |           NULL |     NULL | NULL       |
  13. +----------+------+----------------+----------+------------+
  14. 7 rows in set (0.00 sec)
Como puedes ver, los ID de los posts en la primera tabla salieron todos, sin excepciones. Lo único que sale NULL es aquella columna de la segunda tabla donde no hay comentarios relacionados, lo que incluye el id_posts de esa tabla, pero eso es normal.
Si quiero evitar que esa columna me traiga problemas, simplemente tengo que invocarlas una a una:
Código MySQL:
Ver original
  1. mysql> SELECT P.id_posts, P.post, C.id_comentarios, C.comentario
  2.     -> FROM posts P LEFT JOIN comentarios C ON P.id_posts = C.id_posts;
  3. +----------+------+----------------+------------+
  4. | id_posts | post | id_comentarios | comentario |
  5. +----------+------+----------------+------------+
  6. |        1 | post |           NULL | NULL       |
  7. |        2 | post |              1 | comentario |
  8. |        2 | post |              2 | comentario |
  9. |        3 | post |              3 | comentario |
  10. |        4 | post |              5 | comentario |
  11. |        5 | post |              4 | comentario |
  12. |        6 | post |           NULL | NULL       |
  13. +----------+------+----------------+------------+
  14. 7 rows in set (0.02 sec)
Ahora bien, hay dos cosas a considerar:
1) En el LEFT JOIN el orden de las tablas si altera el producto. En tu caso debes poner siempre la tabla que contiene los posts a la izquierda, puesto que si las inviertes el resultado es completamente distinto:
Código MySQL:
Ver original
  1. mysql> SELECT *
  2.     -> FROM comentarios C LEFT JOIN posts P ON P.id_posts = C.id_posts;
  3. +----------------+----------+------------+----------+------+
  4. | id_comentarios | id_posts | comentario | id_posts | post |
  5. +----------------+----------+------------+----------+------+
  6. |              1 |        2 | comentario |        2 | post |
  7. |              2 |        2 | comentario |        2 | post |
  8. |              3 |        3 | comentario |        3 | post |
  9. |              4 |        5 | comentario |        5 | post |
  10. |              5 |        4 | comentario |        4 | post |
  11. +----------------+----------+------------+----------+------+
  12. 5 rows in set (0.00 sec)

2) No sabemos qué es lo que evalúa esto:
Código MySQL:
Ver original
  1. postwou.object_id=$object_id
y esa condición afecta el resultado completo, pudiendo evitar que ciertos registros salgan en el resultado. Podría ser esa la causa de tu problema, pero desde nuesrta óptica, es imposible de saber (no es nuestra base, ni son nuestros datos).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 06/12/2012, 04:10
 
Fecha de Ingreso: octubre-2012
Mensajes: 7
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Consulta de dos tablas se me atraganta

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Vamos a ver si se entiende y queda claro que lo que hace el LEFT JOIN es precisamente mosrtar las cosas como tu quieres, por lo que resulta difícil comprender cuál es tu problema...
Los pruebo enseguida y te cuento, solo contestarte a tu última pregunta, lo que evalua object_id es el objeto que tiene posts hechos
  #10 (permalink)  
Antiguo 06/12/2012, 04:22
 
Fecha de Ingreso: octubre-2012
Mensajes: 7
Antigüedad: 11 años, 6 meses
Puntos: 0
Respuesta: Consulta de dos tablas se me atraganta

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡CONSEGUIDOOOOOO!!!!!!!!!!!!!!!!! !!!!!!!!!

SELECT P.post_id, P.author_id, P.body, P.created_time, P.object_id, P.author_name, C.fromid, C.text, C.time, C.username FROM postwou P LEFT JOIN comment C ON P.post_id=C.post_id WHERE P.object_id=" . $object_id

La verdad es que ya lo había probado así, pero ahora pienso que tendría un fallito de sintaxis y al ver unas pocas de veces que no funcionaba abandoné la idea de agruparlos... lo ves... soy un paquete en sql. Pero el tio va aprendiendo!!!

Un saludo y tienes todos los puntos de Karma!!! Tus huevos gordos!

Etiquetas: join, select, sql, tabla, tablas
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:00.