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!







tenhos 3 tabelas, sendo as:
tb001
id integer,descricao varchar(20) id sendo chave primaria
tb002
acesso,id,incluir,alterar,excluir sendo acesso chave primaria,id chave estrangeira e incluir alterar e excluir chave estrangeira
tb003
id char(1),descricao char(3) id chave primaria
faco assim: select tb001.id,tb001.descricao,tb002.acesso,tb002.id,tb002.incluir,tb002.alterar,tb002.excluir from tb001 INNER JOIN tb002 ON (tb001.id = tb002.id) INNER JOIN tb003 ON (tb002.incluir = tb003.id)
pergunto: como seria o INNER JOIN na tb003 para os campos alterar e excluir, pois quando coloco-os minha query nao retorna nada.
13/04