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.

¿Fue útil?

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:

  1. Debes usar alias aquí.(El C, A, TS arriba en lugar de los nombres de la tabla completa se llaman alias)

  2. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top