Jump to content

INNER JOIN


kenny
 Share

Go to solution Solved by HappyHippyHippo,

Recommended Posts

Boas tenho duas tabelas que a estrutura é exactamente a mesma e tenho uma query inicial que faz a verificação numa a query está aqui:

FormatEx(Query, sizeof(Query), "SELECT bid FROM %s_bans  WHERE ((type = 0 AND authid REGEXP '^STEAM_[0-9]:%s$') OR (type = 1 AND ip = '%s')) AND (length = '0' OR ends > UNIX_TIMESTAMP()) AND RemoveType IS NULL", DatabasePrefix, auth[8], ip)

Isto é para um jogo e está no codigo do mesmo onde os %s são as variáveis que estão no fim.

1º -> %s = DatabasePrefix

2º -> %s = auth[8] (que é o ID da steam para quem conhece)

3º -> %s = ip do jogador

E agora eu fiz um copy paste para construir uma segunda tabela com a mesma estrutura exactamente igual e queria fazer uma query que verifica se as duas tabelas e verificar se existe o jogador nas duas tabelas falaram me do "Inner Join" mas eu não compreendi muito bem como fazer lo e queria uma ajuda se possível para fazer isso.

Segue abaixo a estrutura das duas tabelas que é a mesma.

Agradeço desde já a ajuda porque eu nao sei mesmo por onde começar.

Obrigado e Cumprimentos.

image.png

Link to comment
Share on other sites

Ou seja ficaria assim entao :

FormatEx(Query, sizeof(Query), "SELECT bid FROM sb_bans AS bans INNER JOIN sb_bansdisconect AS bansdisc ON bansdisc.authid = bans.authid WHERE ((type = 0 AND authid REGEXP '^STEAM_[0-9]:%s$') OR (type = 1 AND ip = '%s')) AND (length = '0' OR ends > UNIX_TIMESTAMP()) AND RemoveType IS NULL", auth[8], ip)
Edited by kenny
Link to comment
Share on other sites

Assim:

FormatEx(Query, sizeof(Query), "SELECT bid FROM sb_bans AS bans INNER JOIN sb_bansdisconect AS bansdisc ON bansdisc.authid = bans.authid WHERE ((bans.type = 0 AND bans.authid REGEXP '^STEAM_[0-9]:%s$') OR (bans.type = 1 AND bans.ip = '%s')) AND (bans.length = '0' OR bans.ends > UNIX_TIMESTAMP()) AND bans.RemoveType IS NULL", auth[8], ip)

Mas sendo assim depois nao terei que fazer WHERE para a tabela bansdisc?

Link to comment
Share on other sites

Assim:

FormatEx(Query, sizeof(Query), "SELECT bid FROM sb_bans AS bans INNER JOIN sb_bansdisconect AS bansdisc ON bansdisc.authid = bans.authid WHERE ((bans.type = 0 AND bans.authid REGEXP '^STEAM_[0-9]:%s$' AND bansdisc.type = 0 AND bansdisc.authid REGEXP '^STEAM_[0-9]:%s$') OR (bans.type = 1 AND bans.ip = '%s' AND bansdisc.type = 1 AND bansdisc.ip = '%s')) AND (bans.length = '0' OR bans.ends > UNIX_TIMESTAMP() AND bansdisc.length = '0' OR bansdisc.ends > UNIX_TIMESTAMP()) AND bans.RemoveType IS NULL AND bansdisc.RemoveType IS NULL", auth[8], auth[8], ip, ip)

E será que nao há problema de repetir as variáveis no fim ?

Link to comment
Share on other sites

Ahhh, não tinha percebido. Há diferenças do que estás a pensar para o que é possível.

Tu estás a criar condições (WHERE) de valores específicos. A expressão ON tem como propósito fazer match entre campos. Podes especificar vários, por exemplo:

SELECT *
FROM sb_bans AS bans
INNER JOIN sb_bansdisconect AS bansdisc ON bansdisc.authid = bans.authid
                                      AND bansdisc.name = bans.name
                                      AND bansdisc.created = bans.created
                                      AND (bansdisc.type = bans.type OR bansdisc.sid = bans.sid);
Link to comment
Share on other sites

O sentido de match que tentei passar é de igualdade, correspondência.

ON bansdisc.authid = bans.authid

Ou seja, o campo authid da tabela bansdisc obrigatoriamente tem de ser igual ao campo authid da tabela bans.

As condições são necessárias quando precisas de atribuir certos valores, que é o que estás a fazer.

WHERE bans.type = 0
Link to comment
Share on other sites

Fiz alguns testes com esta Query:

SELECT * FROM sb_bans AS bans INNER JOIN sb_bansdisconect AS bansdisc  WHERE ((bans.type = 0 AND bans.authid = 'STEAM_0:0:111274527' OR bansdisc.type = 0 AND bansdisc.authid = 'STEAM_0:0:111274527' ) OR (bans.type = 1 AND bans.ip = '%s' AND bansdisc.type = 1 AND bansdisc.ip = '%s')) AND (bans.length = '0' OR bans.ends > UNIX_TIMESTAMP() AND bansdisc.length = '0' OR bansdisc.ends > UNIX_TIMESTAMP()) AND bans.RemoveType IS NULL AND bansdisc.RemoveType IS NULL

E retornou me o valor na base de dados bans até aqui correto.

Mas se eu trocar o valor authid para um valor que tenha na base de dados bansdisc ele nao me retorna nenhum valor e diz que nao tem nada.

SELECT * FROM sb_bans AS bans INNER JOIN sb_bansdisconect AS bansdisc  WHERE ((bans.type = 0 AND bans.authid = 'STEAM_0:0:14218688' OR bansdisc.type = 0 AND bansdisc.authid = 'STEAM_0:0:14218688' ) OR (bans.type = 1 AND bans.ip = '%s' AND bansdisc.type = 1 AND bansdisc.ip = '%s')) AND (bans.length = '0' OR bans.ends > UNIX_TIMESTAMP() AND bansdisc.length = '0' OR bansdisc.ends > UNIX_TIMESTAMP()) AND bans.RemoveType IS NULL AND bansdisc.RemoveType IS NULL

Tenho esta authid na base dados bansdisc e diz me que nao tem nenhum valor.

EDIT: Eu nao sei se me expliquei bem bioshock eu nao sei se é possivel eu quero verificar uma tabela e se esse valor nao tiver na tabela verificar noutra isso é com o INNER JOIN ?

Edited by kenny
Link to comment
Share on other sites

Com o "ON" não funciona nada. Eu so estou a usar o INNER JOIN porque me disseram eu nao sei ao certo se é isso que tenho que usar.

Por isso estou a perguntar e com duvidas para ver se é o INNER JOIN ou outra coisa qualquer.

Desculpa eu não estudo código o que aprendi foi a ver na net. 😞 :(

Se eu utilizar assim:

SELECT * FROM sb_bans AS bans INNER JOIN sb_bansdisconect AS bansdisc ON bans.authid = bansdisc.authid  WHERE ((bans.type = 0 AND bans.authid = 'STEAM_0:0:111274527' OR bansdisc.type = 0 AND bansdisc.authid = 'STEAM_0:0:111274527' ) OR (bans.type = 1 AND bans.ip = '%s' AND bansdisc.type = 1 AND bansdisc.ip = '%s')) AND (bans.length = '0' OR bans.ends > UNIX_TIMESTAMP() AND bansdisc.length = '0' OR bansdisc.ends > UNIX_TIMESTAMP()) AND bans.RemoveType IS NULL AND bansdisc.RemoveType IS NULL

Não me retorna nenhum valor e eu tenho esse valor na base de dados "bans" e se tirar o "ON" já me retorna o valor,

Edited by kenny
Link to comment
Share on other sites

Se te disserem para assaltar um banco, também vais fazê-lo? 😄

Antes de continuares deves então perceber a utilidade do INNER JOIN, até porque existem outros JOINs.

http://www.w3schools.com/sql/sql_join_inner.asp

http://pt.stackoverflow.com/questions/6441/qual-%C3%A9-a-diferen%C3%A7a-entre-inner-join-e-outer-join

Não te retorna nenhum valor porque tens muitas condições aí para o meio, que forçam diferentes resultados. Se fizeres uma query simples irá te retornar - desde que haja correspondência de valores numa tabela e na outra.

SELECT *
FROM sb_bans AS bans
INNER JOIN sb_bansdisconect AS bansdisc ON bansdisc.authid = bans.authid

Tirando a expressão ON é a mesma coisa que fazeres (e que talvez te sirva para o problema):

SELECT * 
FROM sb_bans AS bans, sb_bansdisconect AS bansdisc
WHERE (....)
Edited by bioshock
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.