Pergunta

Eu tenho quatro tabelas:

  • personagens
  • arena_team
  • arena_table_member
  • arena_team_stats.

tabela de caracteres tem guia, nome

A tabela arena_team tem arenateamid, nome, tipo

A tabela arena_table_member tem guid (é o mesmo que na tabela de caracteres), arenateamid

A tabela arena_team_stats tem arenateamid, classificação, vitórias, vitórias2, jogado

Como obtenho a lista de times da arena onde o personagem está?Tentei:

$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());

mas retorna todas as equipes da arena que estão na tabela arena_team.

Foi útil?

Solução

Parece que está faltando um JOIN.É mais fácil ler com aliases de tabela e formatados:

    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

Outras dicas

Você deve usar Joins.Ao usar uma tabela separada por vírgulas na parte FROM, você obtém todas as combinações possíveis no resultado.

Tente esta consulta (usando Joins):

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

Duas coisas:

  1. Você deve usar aliases aqui.(Os c, a, ts acima, em vez dos nomes completos das tabelas, são chamados de aliases)

  2. Se você deseja corresponder exatamente ao caractere '?', use c.name = '?'.c.name como '%?%' retornará todos os c.names que possuem um ?neles.

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

Estavam faltando algumas junções de tabelas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top