MLeandroJr! Postado Dezembro 1, 2010 Denunciar Share Postado Dezembro 1, 2010 Pessoal, me surgiu uma dúvida aqui sobre algo que nunca precisei fazer desta maneira.Eu geralmente resolveria isso com duas consultas, mas hoje quero resolver com uma só.O negócio é o seguinte, eu quero imprimir tudo o que contiver em uma tabela e não na outra.Pra simplificar, imaginem duas tabelas: foo barDentro delas possui a field id.Quero que quando uma id existir em foo e não existir em bar, seja impresso na página.Em teoria, o que preciso é:SELECT id FROM foo WHERE NOT EXISTS (SELECT * FROM bar WHERE id=1)Mas esse id=1 do bar não pose ser estático, ele tem que ser um valor vindo do field id do foo, compreendem?Como procedo com isso? Link para o comentário Compartilhar em outros sites More sharing options...
0 Thelon Postado Dezembro 1, 2010 Denunciar Share Postado Dezembro 1, 2010 (editado) fiz um testetenta assim amorAi está o código completo com o testeCREATE DATABASE M; use m; CREATE TABLE foo( id int, nome varchar(40) primary key, idade int, algumacoisa varchar(40) ); CREATE TABLE bar( id int , nome varchar(40) primary key ); drop table bar; SELECT * FROM foo; SELECT * FROM bar; SELECT id, nome FROM foo WHERE id=1; DELIMITER $$ CREATE PROCEDURE busca(IN item varchar(50)) begin declare x int default (SELECT id FROM foo WHERE nome = item); SELECT * FROM bar WHERE NOT id = x; end $$ drop procedure busca$$ call busca('nome')$$ Editado Dezembro 1, 2010 por Thelon Link para o comentário Compartilhar em outros sites More sharing options...
0 MLeandroJr! Postado Dezembro 1, 2010 Autor Denunciar Share Postado Dezembro 1, 2010 Meu MySQL não cria essa procedure não.Deve ser diferença de versões.Aqui é a 5.1.48 (repositório do Fedora 13). Link para o comentário Compartilhar em outros sites More sharing options...
0 Thelon Postado Dezembro 1, 2010 Denunciar Share Postado Dezembro 1, 2010 (editado) DELIMITER $$ CREATE PROCEDURE busca(IN id_dos_truta int(10), IN regiaoid int(10)) begin //consulta end $$ call busca($id, $regiao); Ai depois você pode usar WHERE regiao_id = regiaoid no where vai o valor recebido na procedure manjo? Aqueles valores que estão dentro do parenteses também são variaveis que podem ser usadas na procedure elas ficam com o valor passado no call é igual função de JavaScript function lol(algumacoisa){ alert(algumacoisa); } lol("Gabriel"); tendeu? Ele da o alart com Gabriel a procedure funciona do mesmo jeito Editado Dezembro 1, 2010 por Thelon Link para o comentário Compartilhar em outros sites More sharing options...
0 MLeandroJr! Postado Dezembro 1, 2010 Autor Denunciar Share Postado Dezembro 1, 2010 O caminho ainda não é este.Preciso que ele busque somente os valores que possuem em uma tabela e não possuem na outra.A procedure da forma que está lá em cima não fará isso.Obs.: No meu MySQL eu precisei voltar o DELIMITER pra ; no fim da instrução, aí ele aceitou a procedure na boa.Pensei em algo assim, mas não funcionou:DELIMITER $$ CREATE PROCEDURE busca(IN regiaoid int(10)) begin declare x int default (SELECT login_id FROM de_login WHERE login_ativo = 'S' AND regiao_id = regiaoid); SELECT * FROM de_login WHERE login_id = x AND login_ativo = 'S' AND regiao_id = regiaoid AND NOT EXISTS (SELECT login_id FROM de_mais_dados_candidato WHERE login_id = x); end $$ DELIMITER ;Ele diz que a subquery retornou mais de um resultado, o que é estranho, pois da forma que está escrito deveria retornar um resultado só pra cada query.Ou estou errado?#1242 - Subquery returns more than 1 row Link para o comentário Compartilhar em outros sites More sharing options...
0 Kakao Postado Dezembro 2, 2010 Denunciar Share Postado Dezembro 2, 2010 (editado) Tenta assim:select dl.* from de_login dl left outer join de_mais_dados_candidato dmdc on dmdc.login_id = dl.login_id where dmdc.login_id is null Editado Dezembro 2, 2010 por Kakao Link para o comentário Compartilhar em outros sites More sharing options...
0 Denis Courcy Postado Dezembro 2, 2010 Denunciar Share Postado Dezembro 2, 2010 Tenta assim:select dl.* from de_login dl left outer join de_mais_dados_candidato dmdc on dmdc.login_id = dl.login_id where dmdc.login_id is null Ok. Mas melhore forçando a leitura da esquerda para a direita assim: select STRAIGHT_JOIN dl.* from de_login dl left outer join de_mais_dados_candidato dmdc on dmdc.login_id = dl.login_id where dmdc.login_id is null Link para o comentário Compartilhar em outros sites More sharing options...
0 MLeandroJr! Postado Dezembro 2, 2010 Autor Denunciar Share Postado Dezembro 2, 2010 Valeu Kakao, valeu Denis, chegando em casa eu tentarei fazer!Tenho muito o que estudar sobre MySQL ainda...----- EDIT -----Funcionou certinho, valeu turma! Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
MLeandroJr!
Pessoal, me surgiu uma dúvida aqui sobre algo que nunca precisei fazer desta maneira.
Eu geralmente resolveria isso com duas consultas, mas hoje quero resolver com uma só.
O negócio é o seguinte, eu quero imprimir tudo o que contiver em uma tabela e não na outra.
Pra simplificar, imaginem duas tabelas:
- foo
- bar
Dentro delas possui a field id.Quero que quando uma id existir em foo e não existir em bar, seja impresso na página.
Em teoria, o que preciso é:
Mas esse id=1 do bar não pose ser estático, ele tem que ser um valor vindo do field id do foo, compreendem?
Como procedo com isso?
Link para o comentário
Compartilhar em outros sites
7 respostass a esta questão
Posts Recomendados