26.12.2014, 01:45
(
Последний раз редактировалось kreison; 26.12.2014 в 02:53.
)
JOIN MySQL
Requisitos para entender esse tutorial
- Conhecimento bбsico em MySQL
1 - Introduзгo
Nesse tutorial iremos falar sobre uma sintaxe do MySQL usada para combinar resultados de duas (ou mais) tabelas, em apenas uma sу consulta e gerando ъnico resultado.
Isso pode ser usado para economizar querys, deixar as consultas mais eficazes e obter resultados mais completos.
Existem alguns tipos de JOIN, os mais utilizados e que aqui serгo abordados, sгo: INNER JOIN e OUTER JOIN.
Aqui nгo serб apresentado nenhum cуdigo PAWN, porйm os conhecimentos obtidos podem ser utilizados no SA-MP.
2 - INNER JOIN

Esse JOIN, tambйm conhecido como JOIN interno, й provavelmente o mais utilizado. Ele retorna apenas os dados que combinarem nas duas tabelas.
Vamos a um exemplo prбtico, temos essas duas tabelas e seus respectivos dados:


Vou executar seguinte consulta
Код:
SELECT nome, orgid, lider, sub FROM `jogador` JOIN `orgsinfo` USING (orgid) WHERE `playerid` = 1
Atй essa parte acredito que esteja tudo bem, selecionei alguns campos da tabela jogador. Mas observe que eu jб indiquei campos tambйm da tabela orgsinfo.
Код:
SELECT nome, orgid, lider, sub FROM `jogador`
Код:
JOIN `orgsinfo`
Код:
USING (orgid)
Код:
WHERE `playerid` = 1

Como podemos ver, o MySQL associou as informaзхes e nos deu apenas um resultado com base nas duas tabelas. O que seria feito com 2 consultas, foi feita em apenas uma e com um resultado mais fбcil de se utilizar.
3 - USING & ON
No exemplo feito no INNER JOIN nуs utilizamos o USING e acredito que tenha dado para entender bem o seu uso. Porйm tambйm й possнvel indicar condiзхes especificas de associaзгo de dados atravйs do ON, veja como ficaria a mesma consulta anterior usando ON:
Код:
SELECT nome, o.orgid, lider, sub FROM `jogador` j JOIN `orgsinfo` o ON (j.orgid = o.orgid) WHERE `playerid` = 1
Vale tambйm ressaltar que nгo й obrigatуrio o uso de USING ou ON, caso nгo seja utilizado nenhum dos dois, o JOIN ira associar automaticamente todos os campos que sejam iguais.
4 - OUTER JOIN (LEFT e RIGHT)
No caso do OUTER JOIN, tambйm conhecido como JOIN externo, nгo й necessбrio que os dados sejam combinados em ambas tabelas. Existem 3 tipos de OUTER JOIN: LEFT, RIGHT e FULL.
Para exemplificar iremos utilizar essa tabelas:


4.1 - LEFT OUTER JOIN

Nesse caso iremos mostrar todos os dados da tabela da esquerda, mesmo que nгo seja correspondente aos dados da tabela da direita.
Vou executar a seguinte consulta:
Код:
SELECT idproduto, qntd, preco, estoque FROM `vendas` LEFT JOIN `produtos` USING (idproduto)
Код:
LEFT JOIN `produtos`

Como podemos ver, existem campos em que estб escrito NULL, pois os dados correspondentes a eles nгo foram encontrados na outra tabela. Porйm como existia tal registro na tabela da esquerda, mesmo nгo existindo correspondкncia na da direita, os dados foram retornados.
4.2 - RIGHT OUTER JOIN

Agora executando estб consulta:
Код:
SELECT idproduto, qntd, preco, estoque FROM `vendas` RIGHT JOIN `produtos` USING (idproduto)
Код:
RIGHT JOIN `produtos`

Novamente temos campos com NULL, pelo mesmo motivo da outra vez, porйm nessa consulta exibimos todos os resultados da direita e os campos NULL sгo os que nгo foram encontrados na da esquerda.
5 - JOIN com GROUP BY e funзхes de grupo
Nгo irei me aprofundar muito nisso, pois pretendo fazer um pequeno tutorial sobre GROUP BY e funзхes de grupo, porйm gostaria de deixar um exemplo de como й possнvel, nгo sу associar dados atravйs do JOIN como tambйm agrupar eles e obter um resultado mais fбcil de se manejar.
Utilizando a tabela do exemplo anterior, de produtos/vendas, irei fazer o seguinte INNER JOIN:
Код:
SELECT idproduto, SUM(qntd) "qntdvendida", SUM(qntd)*preco "precoXqntd", preco, estoque FROM `vendas` JOIN `produtos` USING (idproduto) GROUP BY idproduto

Veja que nгo sу que o campo idproduto nгo foi sу associado, como tambйm foi agrupado com os seus semelhantes e a quantidade dos produtos com o mesmo id foram somadas e assim apresentando um resultado eficaz e limpo.
5 - FIM!
5.1 - Nгo conseguiu entender tudo?
Infelizmente esse assunto as vezes demanda prбtica, por isso tentei mostrar vбrios exemplos e nгo me alongar muito.
Entгo tente fazer seus prуprios JOINS, pratique! Assim vocк ira consegui entender melhor, ver exatamente como funciona o JOIN e criar a percepзгo de quando vocк pode utiliza-lo para melhorar suas consultas.
5.2 - Sugestхes? Erros?
Eu ainda nгo sou muito experiente em fazer tutoriais e por isso aceito sugestхes de como ser mais didбtico e etc. Qualquer erro tambйm que eu tenha cometido em algum conceito ou algo que tenha faltado, й sу dizer que eu arrumo

5.3 - Agradecimentos
Agradecer ao Willian_Luigi e a todo pessoal do grupo SA-MP no Whatsapp.
Obs: Nгo esqueзam de enxer o saco dele pra postar o iCmd :P
5.4 - Links ъteis sobre o assunto
http://www.devmedia.com.br/sql-join-...os-dados/31006 (Algumas imagens desse site foram utilizadas neste tutorial)
http://blog.thiagobelem.net/relacion...elas-no-mysql/
http://dev.mysql.com/doc/refman/5.0/en/join.html