Cómo mostrar correctamente en una tabla datos consultados a dos tablas distintas?

  • Autor Autor punteral
  • Fecha de inicio Fecha de inicio
P

punteral

Beta
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Hola a todos. Estoy trabajando en un código que debe mostrar una tabla, cuyos datos son obtenidos de dos tablas distintas de la misma base datos. Llevo muy poco tiempo programando y por ahora sólo estoy haciendo pruebas en local desde mi ordenador, sin subir nada a ningún hosting web.

La primera tabla se llama "fichas_jugadores" y tiene 4 filas. La segunda se llama "partidos" y tiene 1 fila.

Ahora necesito mostrar en una misma tabla algunos datos de "fichas_jugadores" y otros datos de "partidos". Para hacerlo he realizado dos consultas, una a cada tabla:

PHP:
$sql = "SELECT * FROM fichas_jugadores";
$sql2 = "SELECT * FROM partidos";
$result = mysql_query($sql);
$result2 = mysql_query($sql2);

Y éste es el código para mostrar los datos en forma de tabla:

PHP:
echo "<table>"; //EMPIEZA A CREAR LA TABLA CON LOS ENCABEZADOS DE TABLA

		echo "<tr>";//<tr> CREA UNA NUEVA FILA
		
		echo "<td>Nº PARTIDO</td>";//<td> CREA NUEVA COLUMNA
		echo "<td>JUGADOR 1</td>";
			
		echo "</tr>";


while($row = mysql_fetch_array($result)) {
	  $row2 = mysql_fetch_array($result2);
   
        echo "<tr>";
				echo "<td>".$row2['id_partido']."</td>";			
				echo "<td>".$row2['id_jugador_local'].".".$row['Nombre']." ".$row['Apellido_1']."</a></td>";

		echo "</tr>";
}  
echo "</table>";//FINALIZA LA TABLA

Mi intención es que la tabla resultante tenga las mismas filas que la tabla "partidos", es decir, 1. Sin embargo el resultado que obtengo de este código es una tabla con 4 filas, como "fichas_jugadores":

tabla php.webp

¿Sabéis cómo podría conseguir que la tabla resultante tuviera las mismas filas que la tabla "partidos", pero que muestre datos de ambas tablas?
Gracias por adelantado, un saludo a todos. :encouragement:
 
Última edición:
[MENTION=34658]punteral[/MENTION] creo que no te he entendido bien pero lo que quieres es que en vez de los 4 nombres aparezca uno de ellos?
 
Yo tampoco he entendido muy bien que quiere hacer, pero intuyo que es un problema con las iteraciones, no has diseñado bien los bucles y que tiene que imprimir en cada momento.

Aparte tampoco veo muy claro las consultas que haces, por un lado los jugadores y por otro los partidos, pero no veo como las relaciones, por que doy por hecho que tienen que tener alguna relación no?

Si quieres hacer lo que creo podrías sacarlo todo en una sola consulta y solo tendrías que hacer un bucle para recorrer e imprimir los datos.

Explica un poco mejor que datos quieres mostrar y cual es la estructura de las dos tabla y di hay relación entre ellas.
 
Ambas tablas deben de tener un campo que las relacione, has un JOIN de ambas tablas, algo como:
PHP:
SELECT * FROM partidos p
    INNER JOIN fichas_jugadores fj
        ON sj.campo_relacionado = p.campo_relacionado;

Aunque también faltaría saber más datos de qué es lo que realmente quieres hacer y cómo son las estructuras de tus tablas.

Saludos.
 
Hola a todos. Muchas gracias por vuestras respuestas. Disculpadme que no haya contestado antes pero he estado fuera durante el fin de semana. Intentaré explicarme mejor, ya que cuando escribí el mensaje estaba un poco mareado de buscar soluciones y quizá ni yo tenía muy claro lo que quería hacer ya. Disculpadme si la pregunta era demasiado confusa. A ver si me explico mejor ahora.

Tengo dos tablas en una base de datos.

La primera se llama "fichas_jugadores" y contiene datos sobre los jugadores inscritos en mi web (ID, nombre, apellidos, teléfono, etc)

La segunda se llama "partidos" y contiene los datos sobre los partidos jugados entre esos jugadores (fecha, ID del jugador local, ID del jugador visitante, marcador del jugador local, marcador del jugador visitante).

En mi web quiero presentar una tabla que muestre los datos de los partidos jugados (obtenidos de la tabla "partidos") y que además muestre los nombres de los jugadores que han jugado el partido (obtenidos de la tabla "fichas_jugadores".

Para conseguirlo realicé una consulta a cada tabla para obtener datos de ambas. Pero luego me he liado a la hora de mostrar los datos en una tabla, no sé muy bien como hacerlo. Sobre la relación que decías que debe haber entre las dos tablas supongo que será el ID de los jugadores.

En la tabla "fichas_jugadores" hay una columna con el ID de cada jugador.
En la tabla "partidos" hay una columna con el ID del jugador local y otra columna con el ID del jugador visitante.

Voy a investigar con el método que dice [MENTION=8317]lombervid[/MENTION], quizá sea lo que necesito. Un saludo a todos y gracias. :encouragement:
 
Pues si están relacionados con los ID's solo tendrían que hacer los JOIN's para sacar la información de cada uno. Intenta algo como:

PHP:
SELECT p.*,
        CONCAT_WS(' ', l.nombre, l.apellidos) AS local,
        CONCAT_WS(' ', v.nombre, v.apellidos) AS visitante
    FROM partidos p 
        INNER JOIN fichas_jugadores l 
            ON l.id = p.id_del_jugador_local
        INNER JOIN fichas_jugadores v 
            ON v.id = p.id_del_jugador_visitante;

Saludos.
 
He probado a unir la consulta con un INNER JOIN de la siguiente manera:

PHP:
$sql = "SELECT * FROM partidos AS p 

    	INNER JOIN fichas_jugadores AS fj1 
        ON p.id_jugador_local = fj1.ID_Jugador

        INNER JOIN fichas_jugadores AS fj2
        ON p.id_jugador_visitante = fj2.ID_Jugador";

$result = mysql_query($sql);

Para mostrar la tabla con los datos de los partidos, incluyendo los nombres de los jugadores tengo el siguiente código:

PHP:
while($row = mysql_fetch_array($result)) {

       
echo "<tr>";
echo "<td>".$row['fecha_partido']."</td>";
echo "<td>".$row['id_partido']."</td>";
echo "<td><a href='ficha_jugador.php?ID_Jugador=$row[id_jugador_local]'>".$row['Nombre']." ".$row['Apellido_1']." ".$row['Apellido_2']."</a></td>";
echo "<td><a href='ficha_jugador.php?ID_Jugador=$row[id_jugador_visitante]'>".$row['Nombre']." ".$row['Apellido_1']." ".$row['Apellido_2']."</a></td>";
				
echo "</tr>";

Funciona bien. El problema es que en la tabla que se muestra, aparece el nombre y apellidos del jugador visitante en ambas columnas, tanto en la columna del jugador local como en la del jugador visitante.


lombervid
Pues si están relacionados con los ID's solo tendrían que hacer los JOIN's para sacar la información de cada uno. Intenta algo como:

Código PHP:
SELECT p.*,
CONCAT_WS(' ', l.nombre, l.apellidos) AS local,
CONCAT_WS(' ', v.nombre, v.apellidos) AS visitante
FROM partidos p
INNER JOIN fichas_jugadores l
ON l.id = p.id_del_jugador_local
INNER JOIN fichas_jugadores v
ON v.id = p.id_del_jugador_visitante;
Saludos.

Hola [MENTION=8317]lombervid[/MENTION], muchas gracias. Iba a probar este código que has puesto pero no sé de donde sacar "l.nombre", "l.apellidos", "v.nombre" y "v.apellidos" ya que en la tabla "partidos" sólo tengo almacenados los ID del jugador local y visitante. Los nombres y apellidos están almacenados en la tabla "fichas_jugadores".
 
Suponiendo que tienes esto

PHP:
$sql = "SELECT * FROM partidos AS p INNER JOIN fichas_jugadores AS fj1 ON p.id_jugador_local = fj1.ID_Jugador INNER JOIN fichas_jugadores AS fj2  ON p.id_jugador_visitante = fj2.ID_Jugador";

tienes que ponerle alias para que no se repita el nombre de las columnas.

SELECT p.*, fj1.Nombre Nombrelocal, fj1.Apellido_1 Apellido1Local, fj2.Nombre NombreVisit, fj2.Apellido_1 Apellido1Visit FROM partidos p INNER JOIN fichas_jugadores AS fj1 ON p.id_jugador_local = fj1.ID_Jugador INNER JOIN fichas_jugadores AS fj2 ON p.id_jugador_visitante = fj2.ID_Jugador"; [/PHP]

prueba por ejemplo eso
 
Muchiiiiisimas gracias [MENTION=164943]Rodu16[/MENTION]!!!! Funciona perfecto!! Otra duda más resuelta gracias a este magnífico foro! Mil gracias a todos. :encouragement:
 
He probado a unir la consulta con un INNER JOIN de la siguiente manera:

PHP:
$sql = "SELECT * FROM partidos AS p 

    	INNER JOIN fichas_jugadores AS fj1 
        ON p.id_jugador_local = fj1.ID_Jugador

        INNER JOIN fichas_jugadores AS fj2
        ON p.id_jugador_visitante = fj2.ID_Jugador";

$result = mysql_query($sql);

Para mostrar la tabla con los datos de los partidos, incluyendo los nombres de los jugadores tengo el siguiente código:

PHP:
while($row = mysql_fetch_array($result)) {

       
echo "<tr>";
echo "<td>".$row['fecha_partido']."</td>";
echo "<td>".$row['id_partido']."</td>";
echo "<td><a rel='nofollow' href='ficha_jugador.php?ID_Jugador=$row[id_jugador_local]'>".$row['Nombre']." ".$row['Apellido_1']." ".$row['Apellido_2']."</a></td>";
echo "<td><a rel='nofollow' href='ficha_jugador.php?ID_Jugador=$row[id_jugador_visitante]'>".$row['Nombre']." ".$row['Apellido_1']." ".$row['Apellido_2']."</a></td>";
				
echo "</tr>";

Funciona bien. El problema es que en la tabla que se muestra, aparece el nombre y apellidos del jugador visitante en ambas columnas, tanto en la columna del jugador local como en la del jugador visitante.




Hola [MENTION=8317]lombervid[/MENTION], muchas gracias. Iba a probar este código que has puesto pero no sé de donde sacar "l.nombre", "l.apellidos", "v.nombre" y "v.apellidos" ya que en la tabla "partidos" sólo tengo almacenados los ID del jugador local y visitante. Los nombres y apellidos están almacenados en la tabla "fichas_jugadores".

Te muestra solo los datos del visitante porque el último JOIN que hiciste fue relacionado con el ID de visitante y prácticamente te sobrescribió los del local.

En los campos l.nombre, v.nombre, etc, l y v es la tabla fichas_jugadores renombrada para el local y visitante respectivamente. La consulta tal y como la puse, únicamente cambiando los nombres de los campos (id, id_del_jugador_loca, id_del_jugador_visitante) por sus respectivos nombres correctos, te debería de funcionar.

Saludos.
 
Te muestra solo los datos del visitante porque el último JOIN que hiciste fue relacionado con el ID de visitante y prácticamente te sobrescribió los del local.

Me lo estaba imaginando, pero no sabía como solucionarlo. Utilizando alias como dijo Rodu16 se solucionó.

En los campos l.nombre, v.nombre, etc, l y v es la tabla fichas_jugadores renombrada para el local y visitante respectivamente. La consulta tal y como la puse, únicamente cambiando los nombres de los campos (id, id_del_jugador_loca, id_del_jugador_visitante) por sus respectivos nombres correctos, te debería de funcionar.

Muchas gracias lombervid. No sé si me he enterado bien, creo que si lo comprendo. Sé que en los campos "l.nombre", "v.nombre", etc, te refieres a local y visitante, pero es que en la tabla "fichas_jugadores" no se sabe cual es el local y cual el visitante.

De todas maneras el problema se ha solucionado utilizando alias como dijo Rodu16.
 
Atrás
Arriba