Consulta con mesas múltiples
-
29-09-2020 - |
Pregunta
Tengo cuatro tablas:
- caracteres
- arena_team
- arena_table_member
- arena_team_stats.
Tabla de caracteres tiene GUID, nombre
arena_team mesa tiene arenateamid, nombre, tipo
arena_table_member tabla tiene guía (esto es lo mismo que en la tabla de caracteres), Arenateamid
arena_team_stats Tabla tiene arenateamid, calificación, victorias, wins2, jugado
¿Cómo obtengo la lista de equipos de arena donde está el personaje?Lo intenté:
$result=mysql_query("SELECT
characters.guid
, characters.name
, arena_team.arenateamid
, arena_team.name
, arena_team_stats.rating
, arena_team_stats.wins
, arena_team_stats.wins2
, arena_team_stats.played
, arena_team.type
FROM characters
, arena_team_stats
, arena_team
WHERE characters.name LIKE '%$q%'
AND arena_team.arenateamid = arena_team_stats.arenateamid
ORDER BY arena_team_stats.rating DESC")
or die(mysql_error());
Pero devuelve todos los equipos de arena que están en la mesa de arena_team.
Solución
Parece que te estás perdiendo una unión.Es más fácil leer con alias de mesa y formateado:
SELECT c.guid
, c.name
, at.arenateamid
, at.name
, at.type
, ats.rating
, ats.wins
, ats.wins2
, ats.played
FROM characters c
INNER JOIN arena_team_member atm ON atm.guid = c.guid
INNER JOIN arena_team at ON at.arenateamid = atm.arenateamid
INNER JOIN arena_team_stats ats ON ats.arenateamid = at.arenateamid
WHERE c.name LIKE '%$q%'
ORDER BY ats.rating DESC
Otros consejos
Debes usar las uniones en su lugar.Cuando usa la tabla separada por coma en la parte from, obtiene todas las combinaciones posibles en el resultado.
Pruebe esta consulta (usando las uniones):
SELECT c.guid,c.name,a.arenateamid,a.name,
ts.rating,ts.wins,ts.wins2,
ts.played,a.type
FROM characters c
JOIN arena_table_member ON arena_table_member.guid=character.guid
JOIN arena_team a ON arena_table_member.arenateamid = a.arenateamid
JOIN arena_team_stats ts ON ts.arenateamid = a.arenateamid
WHERE c.name LIKE '%$q%'
AND a.arenateamid = ts.arenateamid
ORDER BY ts.rating DESC
DOS COSAS:
-
Debes usar alias aquí.(El C, A, TS arriba en lugar de los nombres de la tabla completa se llaman alias)
-
Si desea igualar exactamente con el carácter '?', use C.Name= '?'.C.Name ¿Como '%?%' devolverá todos los c.names que tienen un?en ellos.
SELECT Char.guid, Chars.name, Teams.arenateamid, Teams.name, Stats.rating,
Stats.wins, Stats.wins2, Stats.played, Teams.type
FROM characters AS Chars,arena_team_stats AS Stats, arena_team AS Teams,
arena_table_member AS Members
WHERE Chars.name LIKE '%$q%' AND Teams.arenateamid = Stats.arenateamid AND
Members.guid = Chars.guid AND Members.arenateamid = Teams.arenateamid
ORDER BY Stats.rating DESC
Falta unas uniones de mesa.