2010-07-25 5 views
1

J'ai quatre tables:requêtes sur des tables multi-

  • caractères
  • arena_team
  • arena_table_member
  • arena_team_stats.

table de caractères a GUID, le nom

table de arena_team a arenateamid, le nom, le type

table de arena_table_member a guid (ce qui est le même que dans le tableau de caractères), arenateamid

table arena_team_stats arenateamid, rating, wins, wins2, joué

Comment puis-je obtenir la liste des équipes d'arène où le personnage est? J'ai essayé:

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

mais cela retourne toutes les équipes d'arène qui sont dans la table arena_team.

Répondre

1

On dirait que vous êtes absent JOIN. Il est plus facile à lire avec des alias de table et mis en forme:

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 
3

Vous devez utiliser Joins à la place. Lorsque vous utilisez une table séparée par des virgules dans la partie FROM, vous obtenez toutes les combinaisons possibles dans le résultat.

Essayez cette requête (en utilisant Rejoint):

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 

Deux choses:

  1. Vous devez utiliser les alias ici. (Les c, a, ts ci-dessus à la place des noms de table complets sont appelés alias)

  2. Si vous voulez correspondre exactement au caractère '?', Utilisez c.name = '?'. c.name comme '%?%' retournera tous les c.names qui ont un? en eux.

0
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 

Vous avez été absent une jointures de table.

Questions connexes