Запрос с несколькими таблицами
-
29-09-2020 - |
Вопрос
У меня есть четыре стола:
- .
- символы
- arena_team
- arena_table_member
- arena_team_stats.
GUID, имя
arena_team таблицы имеет аренатеамид, имя, тип
arena_table_member table GUID (это так же, как на таблице символов), аренатеамид
arena_team_stats Стол имеет аренатеамид, рейтинг, выигрыш, WINS2, играл
Как получить список команд Arena, где есть персонаж?Я попробовал:
$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());
.
Но он возвращает все команды Arena, которые находятся в таблице Arena_Team.
Решение
Похоже, тебе не хватает присоединения.Легче прочитать с псевдонимами настольные и отформатированные:
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
. Другие советы
Вы должны использовать воедины вместо этого.Когда вы используете стол запятой таблицы в отрезе, вы получаете все возможные комбинации в результате.
Попробуйте этот запрос (используя соединения):
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
.
Две вещи:
-
Вы должны использовать псевдонимы здесь.(C, A, TS выше вместо полных имен таблиц называется псевдонимами)
-
Если вы хотите точно соответствовать символу «?», Используйте C.Name= '?'.C.Name, как «%?%» вернет все C.Names, которые имеют?в них.
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
.
Вам не хватало таблицы.