Объединение трех таблиц в MSSQL - PullRequest
1 голос
/ 09 января 2012

У меня есть три таблицы в MSSQL для игры, которые структурированы следующим образом:

CHARS Вот таблица соответствия:

  • strAccount, который связан с первичным ключом NGSCUSER, это имя пользователя аккаунта
  • strChar01, который является первым слотом для символов
  • strChar02, который является вторым слотом символа
  • strChar03, который является третьим слотом для символов

у них есть первичный ключ таблицы gameuser внутри, они являются именами персонажей

NGSCUSER

  • имя пользователя учетной записи strUserID
  • пароль учетной записи strPasswd

GAMEUSER

  • strUserId Это имя персонажа
  • sРанк, является ли персонаж мастером игры

Что мне нужно сделать, это сравнить данные для входа в систему с PHP-переменными $ username и $ password в запросе и, что наиболее важно, проверить их связанный символ и выяснить, имеет ли он sRank 1

Полагаю, мне нужно какое-то объединение в три таблицы, но я не знаю, как это сделать. Любые примеры или помощь будут высоко оценены

Это запрос, который я пытался построить до сих пор, но он содержит ошибку в третьей строке с неправильным синтаксисом около 'CHARS':

SELECT NGSCUSER.strUserID, NGSCUSER.strPasswd, GAMEUSER.sRank 

FROM 'CHARS'

INNER JOIN NGSCUSER ON NGSCUSER.strUserId = CHARS.strAccount
INNER JOIN GAMEUSER ON GAMEUSER.strUserId = CHARS.strChar01
INNER JOIN GAMEUSER ON GAMEUSER.strUserId = CHARS.strChar02
INNER JOIN GAMEUSER ON GAMEUSER.strUserId = CHARS.strChar03


WHERE NGSCUSER.strUserId='$username' and NGSCUSER.strPasswd='$password' and GAMEUSER.sRank = '1'

Ответы [ 3 ]

2 голосов
/ 09 января 2012

Во-первых, чтобы буквально ответить на ваш вопрос (который, вероятно, не решит вашу проблему), вам нужно создать псевдоним ваших таблиц для объединения нескольких таблиц:

select * from [chars] c
inner join ngscuser n on n.strUserId = c.strAccount
inner join gameuser g1 on g1.strUserId = c.strChar01
inner join gameuser g2 on g2.strUserId = c.strChar02
inner join gameuser g3 on g3.strUserId = c.strChar03
where n.strUserId='$username' and n.strPasswd='$password' and g1.sRank = '1'

Однако, если вы пытаетесь вернуть строку gameuser, которая соответствует любому слоту символа, вам нужно использовать in:

select n.strUserID, n.strPasswd, g.sRank 
from [chars] c
inner join ngscuser n on n.strUserId = c.strAccount
inner join gameuser g on g.strUserId in (c.strChar01, c.strChar02, c.strChar03)
where n.strUserId='$username' and n.strPasswd='$password' and g.sRank = '1'

И теперь, когда я обращаю ваше внимание, я хотел бы сделать следующие СРП:

  1. Надеюсь, вы дезинфицируете $username и $password, так что вы не подвержены SQL-инъекции.
  2. Не не хранить пароли в текстовом виде. Вы должны хранить их только как соленые хэши. Если вы можете набрать select * from ngscuser и получить пароль для всех, позор вам. Позор. Позор. Позор.
0 голосов
/ 09 января 2012

Вот пример функции для обработки того, о чем вы просите:

function functionName($username,$password){

    SELECT tablename.colname AS alias, tablename.colname2 AS alias2, ...
    FROM tablename tn
    JOIN talbename tn2  on tn2.colname = tn.colname
    JOIN anothertable tn3 on tn3.colname = tn2.colname

    WHERE tn.colname = $username AND rl.password ='$password'
    AND tn3.colname = 1
 }
0 голосов
/ 09 января 2012

Это должны быть просто CHARS, а не 'CHARS'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...