2010-07-25 3 views
1

У меня есть четыре таблицы:запросов с несколькими таблицами

  • символы
  • arena_team
  • arena_table_member
  • arena_team_stats.

таблица символов имеет GUID, имя

arena_team таблица arenateamid, название, тип

arena_table_member таблица Guid (это то же самое, что и в символах таблицы), arenateamid таблицы

arena_team_stats имеет arenateamid, рейтинг, выигрывает, wins2, играл

Как получить список команд арены, где персонаж? Я пробовал:

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

но он возвращает все команды арены, которые находятся на столе арены.

ответ

1

Похоже, что вам не хватает СОЮЗА. Это легче читать с алиасов таблиц и отформатирован:

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

Вместо этого вы должны использовать Joins. Когда вы используете таблицу разделенных запятыми в части FROM, вы получаете все возможные комбинации в результате.

Попробуйте этот запрос (с использованием соединения):

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 

Две вещи:

  1. Вы должны использовать псевдонимы здесь. (C, a, ts выше вместо полных имен таблиц называются псевдонимами)

  2. Если вы хотите точно соответствовать символу '?', Используйте c.name = '?'. c.name, как «%?%», вернет все c.names, у которых есть? в них.

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 

Вы отсутствовали некоторые объединения таблиц.