Update com duas tabelas com Inner join

As vezes precisamos fazer um update que envolve várias tabelas, ou porque você quer executar essa query diretamente de um aplicativo que entende somente a sintaxe sql ou porque você quer ganhar velocidade na execução do update, etc etc.

As razões podem ser várias, mas antes de vermos como fazer um update envolvendo mais de uma tabela vamos criar uma situação onde precisaremos desse update e também veremos como fazer o serviço via php. Isso tudo pra facilitar o entendimento de quem está iniciando com mysql.

Problema:
Você recebe um banco de dados de um cliente contendo duas tabelas (autor, artigo):

A tabela autor tem os seguintes campos:
- ID
- user_nicename
- display_name

A tabela artigo tem os seguintes campos:
- ID
- post_autor
- post_title
- post_content

Acontece que, invés do usuário cliente ter utilizado o ID da tabela autor como referência na tabela artigo no campo post_autor, ele utilizou alí o user_nicename. Como se trata de um campo não inteiro, essa consulta pode levar muito mais tempo que levaria. Lhe vem a idéia de arrumar isso – eis que nossa situação está criada -, então vejamos o passo a passo para tal:

1- Primeiro você precisará criar outro campo inteiro na tabela artigo, coloque um nome sugestivo como autor_id
2- Crie um arquivo php para fazer o trabalho para você, veja como ficaria o script:

$conn = mysql_connect("localhost", "root", "") or die("erro na conexão");
mysql_select_db("banco",$conn);

$result = mysql_query("select ID, user_nicename from autor",$conn);

while($row = mysql_fetch_array($result)){
	update_artigo($row["ID"],$row["user_nicename"]);
}

function update_artigo($id_author, $nm_author){
	global $conn;
	$result = mysql_query("update artigo set autor_id = $id_author where post_autor='".$nm_author."'", $conn);
}

No exemplo acima foi feito basicamente o seguinte, você se conectou ao servidor, selecionou o banco de dados, executou uma consulta que retornou todos os ID e user_nicename de todos os autores, fez um while nos autores e executou a função update_artigo passando sempre dois parâmetros, o ID e o user_nicename; A função update_artigo atualiza o campo autor_id da tabela artigo conferindo antes se o campo post_autor corresponde ao campo user_nicename da tabela autor.

Esse exemplo em php funciona perfeitamente, mas como você notou nós utilizamos duas queries, e o intuito aqui é utilizar apenas um, vamos ver como fazer isso com um update em duas tabelas

3- O grande segredo está na montagem da query, veja como você deve montar a query usando o inner join:

update artigo ar inner join autor au on au.user_nicename = ar.post_autor set ar.autor_id=au.ID;

Fácil né, resolvemos aqui nosso problema, mas vejamos outros exemplos com mais condições:

update artigo ar inner join autor au on au.user_nicename = ar.post_autor set ar.autor_id=au.ID WHERE au.ID > 50 AND ar.post_title = "update com duas tabelas com Inner join";

Caso você precise conferir mais condições, basta ir inserindo AND e a condição em sí, mas e se o update envolvesse mais tabelas? Bem, é simples, bastar uní-las com o inner join, veja esse exemplo com quatro tabelas:

update artigo ar inner join autor au on au.user_nicename = ar.post_autor inner join comentario c on c.id_artigo = ar.ID inner join tag t on t.id_artigo = ar.ID set ar.autor_id=au.ID WHERE au.ID > 50 AND ar.post_title = "update com duas tabelas com Inner join" AND c.user_name<>"spamviagra" AND t.ds_tag<>"teste";

Claro que quanto mais condições você colocar nas cláusulas, mais demorado será para executar o comando.

É isso aí, vimos nesse artigo como fazer um update com várias tabelas usando inner join no Mysql

Take care!


Ofertas Mercado Livre
Celular Mp10 Mp12 E71 Tv 2 Chips Desbloqueado Camera   Capa
Celular Mp10 Mp12 E71 Tv 2 Chips Desbloqueado Camera Capa
Mais info»
R$ 179.98
até 18x de 13.50
Celular Mp20 F035 Com Gps Gratis Wi Fi Tv 2 Chips 2gb Brinde
Celular Mp20 F035 Com Gps Gratis Wi Fi Tv 2 Chips 2gb Brinde
Mais info»
R$ 348.98
até 18x de 26.17
Mp Tudo Celular Mini Hiphone  Tv  Java   2gb Frete Grátis
Mp Tudo Celular Mini Hiphone Tv Java 2gb Frete Grátis
Mais info»
R$ 199.00
até 18x de 14.93
Mini Hiphone Mp12 Celular 2chips   Tv   Caneta   Capa   2gb
Mini Hiphone Mp12 Celular 2chips Tv Caneta Capa 2gb
Mais info»
R$ 179.90
até 18x de 13.49
Celular Mp15 Quadriband Vaic A1900 Tv Camera 2 Chips Jogos
Celular Mp15 Quadriband Vaic A1900 Tv Camera 2 Chips Jogos
Mais info»
R$ 196.99
até 18x de 14.77
Celular Mp12 Mini Hiphone 2chips Vaic N8 Câmera 8.0 Java  Tv
Celular Mp12 Mini Hiphone 2chips Vaic N8 Câmera 8.0 Java Tv
Mais info»
R$ 197.00
até 18x de 14.78
Vitrine Profissionais Web  
Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Blogplay
  • Add to favorites
  • Linkter
  • MyShare
  • PDF
  • Reddit
  • RSS
  • StumbleUpon
  • Tumblr
  • Twitter
  • Yahoo! Bookmarks
This entry was posted in Mysql and tagged , , , , , , , , . Bookmark the permalink. Post a comment or leave a trackback: Trackback URL.
  • Ganhar Dinheiro Online
  • Receba DINHEIRO DIARIAMENTE na Conta BANCÁRIA

Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

    • Receba Novidades no Email:

    • Digite seu Email: