Problema con JOIN dos veces a la misma tabla

squ4r3

Hola compañeros, estoy adentrándome en el interesante mundo de las bases de datos (la verdad es que no tengo mucha idea) y he llegado a un problema que no se resolver, a ver si alguien me echa una mano.

Tengo dos tablas, usuarios y matches

usuarios tiene su id, nombre, contraseña y tal

matches tiene su propio id, y luego los nombres de los jugadores que participan en dicho "match", "player_id_1" y "player_id_2", así como "player_winner_id" para el que gana.

el caso es que tengo las tablas correctamente relacionadas, pero me gustaría sacar los resultados de un partido sustituyendo el "player_id_1" y 2 por lo que corresponda en la columna "nombre" de la tabla usuarios

esto lo hago con

$result = mysql_query("SELECT player_1_id, player_2_id, ronda, result, replay_1, replay_2, replay_3, vod, mapa, nombre FROM matches INNER JOIN usuarios ON matches.player_1_id = usuarios.id");

y todo correcto, me saca el nombre del jugador 1, pero como puedo hacer para que tire tambien de la tabla usuarios para sacarme el id del jugador 2 y el ganador? He visto algo de utilizar alias para hacer un join dos veces a la misma tabla, pero o lo usan de otra forma o no me entero, porque no consigo que me salga.

Además, luego me ha dicho que el valor "nombre" era ambiguo, porque claro, supongo que me querrá sacar también el id 2 como "nombre", donde ya está el valor del player 1. No se si me explico bien xD

un saludo y muchas gracias por adelantado

SiNSoNiDo

En el SELECT pon usuarios.player_1_id y aparecerá el nombre del usuario que hay en la tabla usuarios en vez de el valor que hay en la tabla matches.

edit: siempre y cuando en la tabla usuarios esté el campo player_1_id y este contenga el nombre.

yarviT0

SELECT m.player_1_id, m.player_2_id, m.ronda, m.result, m.replay_1, m.replay_2, m.replay_3, m.vod, m.mapa, m.nombre FROM matches m INNER JOIN usuarios u ON m.player_1_id = u.id

y pones u.nombre_campo para sacar los campos que quieras de la tabla usuarios (esos campos deben existir en la tabla usuarios).

Soltrac

Tranqui, yo sí te he entendido.

SELECT player_1_id, player_2_id, ronda, result, replay_1, replay_2, replay_3, vod, mapa, u.nombre, u2.nombre FROM matches INNER JOIN usuarios ON matches.player_1_id = usuarios.id
INNER JOIN usuarios as u2 ON matches.player_2_id = u2.id

Te cruzas con la tabla 2 veces y punto.

1 respuesta
eXtreM3

No me gustan los inner join. Prueba esto

$result = mysql_query("SELECT matches.*, usuarios.nombre FROM matches,usuarios WHERE matches.player_1_id = usuarios.id");
3 respuestas
HeXaN

#1 Te iba a escribir lo mismo que #5 xD

squ4r3

Bieen! lo he conseguido, gracias a todos, he hecho una pequeña variación de lo que ha dicho #4, dejándolo así

SELECT player_1_id, player_2_id, ronda, result, replay_1, replay_2, replay_3, vod, mapa, u1.nombre, u2.nombre FROM matches INNER JOIN usuarios AS u1 ON matches.player_1_id = u1.id
INNER JOIN usuarios AS u2 ON matches.player_2_id = u2.id

También probaré como dice #5 para evitar hacer el inner join

:)

elkaoD

#5 eso no es al fin y al cabo un producto cartesiano a secas? Si no me equivoco en este caso el INNER JOIN es mucho más eficiente.

EDIT: Por lo que he visto en Wikipedia no es más que un INNER JOIN implícito, así que hace lo mismo con una sintaxis mucho más ligera. El producto cartesiano sería sin cláusula WHERE, aunque supongo depende de la implementación del SGBD. Minipunto.

1 respuesta
eXtreM3

#8 claro, es un inner join a fin de cuentas, solo que desde el principio de los tiempos hago producto cartesiano y después igualas los campos en el where ;) (importante eso último). Es muy mecánico y muy sencillo.

2 respuestas
elkaoD

#9 el tema es cómo lo implementa la SGBD. Si usa un INNER JOIN implícito, no hay problema. Si hace el producto cartesiano y luego evalúa la cláusula, estás jodido en memoria y procesamiento.

0buS

#9 No es lo mismo el producto cartesiano que el resultado de un join.

eXtreM3

En MySQL primero se interpreta siempre el where y después se realiza el producto cartesiano de los valores que lo cumplan.

1 respuesta
elkaoD

#12 en SQL Server también ejecuta el JOIN implícito, pero no pondría la mano en el fuego para todo SGBD.

Soltrac

Casi todos (por no decir todos) los optimizadores de consultas SQL de los SGBD hacen esta consulta de igual manera, así que es indiferente como lo escribais.

Usuarios habituales

  • Soltrac
  • elkaoD
  • eXtreM3
  • 0buS
  • squ4r3
  • HeXaN
  • SiNSoNiDo