Unir dos tablas mysql + PHP?

vincen

Llevo un muy buen rato comiéndome la cabeza y probando códigos y ya me he cansado, a ver si alguien me hecha una mano.

Lo que necesito es unir las siguientes dos tablas "forum_threads" y "forum_replies"

forum_threads: Tabla que almacena los temas.

ID | name | author | entre otras cosas

forum_replies: Tabla que almacena las respuestas a los temas.

ID | name | author | entre otras cosas

ID: ID autoincrement
Name: Nombre del tema
Author: Autor :D

Lo que quiero hacer es mostrar los últimos 5 temas/respuestas juntos creadas por el usuario en uno.

Por ejemplo mostrar solo las 5 ultimas respuestas es muy fácil y seria así:

<?php
$stats_foro = @mysql_query("SELECT * FROM forum_replies WHERE author = '$usuario' ORDER BY id DESC LIMIT 5");


while($rowx=mysql_fetch_array($stats_foro))
{
		
echo $rowx['name'];
echo "<br>";
}

?>

Así mostraria esto:

Ultimas respuestas de pepe en el foro:

-Nombre tema 1 -Respuesta
-Nombre tema 2 -Respuesta
-Nombre tema 3 -Respuesta
-Nombre tema 4 -Respuesta
-Nombre tema 5 -Respuesta

Y yo quiero que muestre:

Ultimas respuestas y temas creados por pepe:

-Nombre tema 1 -Respuesta
-Nombre tema 2 -Creo un tema nuevo
-Nombre tema 3 -Creo un tema nuevo
-Nombre tema 4 -Respuesta
-Nombre tema 5 -Creo un tema nuevo

espero haberme explicado bien..

elkaoD

http://www.w3schools.com/sql/sql_union.asp

Aunque tendrás que hacer que la proyección sea la misma con la expresión del SELECT.

1 respuesta
vincen

#2
Yo estaba probando con el INNER JOIN y no he conseguido nada.

He probado el UNION que dices

Y solo "detecta" las respuestas, he creado un post y no aparece, respondo al mismo post y aparece en los ultimas 5 post/respuestas.

Este es el código


?php
					
	$stats_foro = @mysql_query("SELECT name, author, id FROM forum_threads UNION SELECT name, author, id FROM forum_replies WHERE author = '$perfilde' ORDER BY id DESC LIMIT 10"); 
  
	
	
	while($rowx=mysql_fetch_array($stats_foro))
	{
	
	    echo $rowx['name'];
		echo "<br>";
	}

?>


Donde esta el fallo?

B

Si haces un union a la tabla respuestas y no hay respuestas normal que no te salgan resultados, tendrás que hacer 2 queries.

1 respuesta
vincen

#4 hmm? Me he explicado mal?

Yo quiero que salga cuando crea un post o responde, ahora solo sale cuando responde a un post.

1 respuesta
BH99

#5 Para mi si te has explicado mal, llevo un rato leyendo y no acabo de entenderlo.

Quieres mostrar un listado de los 5 últimos eventos del usuario de la union entre ambas tablas, no?

Es decir,

Tema X -> comentó lo que sea

Tema X - fue el autor, lo creo el

Tema Z - fue el autor, lo creo el

Tema Y - comentó lo que sea

Tema Y- comentó lo que sea

Si te medio entendido bien... no puedes hacer un ORDER BY por ID, sino con un campo TIMESTAMP, ya que se trata de dos tablas distintas con distinto numero de ID.

Crea un nuevo campo TIMESTAMP en ambas tablas y checkea las opciones

Luego con un UNION

select author,name,campotiempo as TIEMPO
  from forum_threads
 where author = '$usuario' 
union 
select author,name,campotiempo as TIEMPO
  from forum_replies
  where author = '$usuario' 
order by TIEMPO desc

Tendrá algún fallo de sintaxis, pero así debería funcionar, ya me dices.

1 respuesta
vincen

#6 Gracias, con eso y combinando otra cosa he logrado hacerlo funcionar, gracias :D

1 respuesta
BH99

#7 Me alegra :D
No has creado el campo fecha? Porque has ordenado?

Te dije lo del campo fecha porque no sabia que mas campos tenia tu tabla, quizás podías utilizar otro que imagino que eso habrás hecho.

1 respuesta
vincen

#8 Mi tabla ya tenia lo que me habías dicho pero no me di cuenta y ordenaba por ID :palm:

Tenia date y last_date

Ahora que ya tengo esto voy a ponerme con el sistema de amigos y despues con los mp's

28 días después
P4tr1

ya se que esto aqui no viene al caso lo que pasa es que esta es la primera hebra que veo de php.
Mi pregunta es la siguiente si yo tengo una tabla tal que asi:

antecedente(ID_antecedente, ID_atr_val) las union de las dos forma la clave primaria,

y la tuplas que contiene son las siguientes:

1 --- 2
1 --- 1
2 --- 4
2 --- 2
2 --- 1
3 --- 6

MI PREGUNTA ES: ¿si a mi me dan como parámetro de entrada, por ejemplo; 1, 2 que son ID_atr_val, como obtendría seria para que me mostrara solo las dos primeras tuplas ?

estoy probando haciendo:
--> SELECT * FROM antecedente WHERE ID_atr_val = "1,2" GROUP BY ID_antecedente

lo que pasa es que esta consulta solo me muestra la tupla 1 --- 1 y la 2 --- 1 y lo que me deveria de salir es 1 --- 1 y 1 --- 2
Tambien he provado con WHERE ID_atr_val = 1 AND ID_atr_val = 2 .... y nada

2 respuestas
xPipOx

#10 Si te dan 1,2 deberias ordenarlo por id_antecedente no por id_atr_val y deberias poner 1 no 1,2. Vamos eso, o no me he enterado nada de lo que has puesto xD.

Espera que releyendo ya te he entendido creo.

SELECT * FROM antecedente WHERE id_antecedente = "1" AND ID_atr_val = "1" OR ID_atr_val = "2" ?

De todas formas hace 2 años que no toco BBDD.

elkaoD

#10 "ya se que esto aqui no viene al caso lo que pasa es que esta es la primera hebra que veo de php."

Haber abierto otra sin miedo, que para eso está el botón de nuevo tema ;)

Usuarios habituales