Ir para conteúdo
Omar~

Dúvida na melhor forma de proceder

Recommended Posts

Vou simplificar porque se explicar com detalhes a situação vai muitas linhas então:

Preciso realizar tal tarefa:

Selecionar 2 tabelas distintas cujo possuem os mesmos valores e ver se tal campo exite em qualquer uma delas.

Obs.: Nunca haverá os mesmos registros em ambas

Exemplo: se tabela_1 tem o nome joão na tabela_2 não terá joão e virse-versa. Então preciso saber se tem joão na tb1 ou na 2 logo preciso trazer os resultados dos campos da tabela que contenha o resultado que buscar.

Certo esse seria o exemplo genérico:

<?php
$mail = 'fulano@fulano.com';
$query = "SELECT mail FROM tabela_a WHERE mail = :datamail
          UNION
          SELECT mail FROM tabela_b WHERE mail = :datamail";

Então se existir o e-mail na tabela A ou B o resultado é true. Porém dessa forma não dar para trazer os demais campos da tabela cujo o resultado exista, em base ambas tabelas também possuem a coluna 'hash' e é esse dado que preciso capturar.

 

A questão é dar para fazer com um select só? Como?

 

Porque do contrário só me vem a cabeça consultar independentemente cada tabela e se houver resultado usar a consulta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Omar.

Fiz uns testes aqui, essa query funciona exatamente da forma como você quer:

SELECT * FROM (
   SELECT mail,name FROM tabela_a WHERE mail = :datamail
   UNION
   SELECT mail,name FROM tabela_b WHERE mail = :datamail
) t
GROUP BY mail,name
HAVING count(*) = 1

Se houver o mesmo email em ambas as tabelas, ele retorna com os resultados, se não houver, retorna nada.

Só não te explico detalhadamente o pq que funciona pq eu preciso estudar mais sobre group by e having, mas essa query achei no stack e lá tem a explicação:

https://stackoverflow.com/questions/17411866/how-can-i-compare-if-2-tables-have-the-same-data

 

Obs: toma cuidado na hora de copiar e colar o código do fórum, pq com as atualizações recentes, ta com um bug de characteres, dependendo da sua ide, se copiar e colar o código a ide não vai reconhecer alguns characteres e ai o código vai quebrar, tem que testar aí.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que o que você quer seja isso:

SELECT id, email FROM (
    SELECT id, email FROM tabela1
    UNION
    SELECT id, email FROM tabela2
)
WHERE email IN ('fdsfds@fdsfxsda.com', 'email@dominio.com.br', 'exemplo@outo_dominio.com.br')
GROUP BY email

 

Coloquei id no meio apenas para você ver que dá pra pegar outras colunas. Você iria substituir isso pelo hash.

 

Primeiro você une tudo, depois filtra e com o IN você faz isso em apenas uma consulta.

A questão é: se a quantidade de e-mails for extremamente grande, não sei na prática o que seria mais rápido... só testando.

De qualquer forma, suspeito que assim seja bastante eficiente para o propósito. Apenas certifique-se de tornar email um índice, em cada uma das tabelas.

 

Ah, e não se assuste com o uso de UNIONs. Se você usasse um JOIN ou select de mais de uma tabela, o resultado não seria muito diferente, pois internamente o banco está fazendo mais de uma consulta de qualquer forma.

 

EDIT:

Ah, lembrei que você pode querer saber de qual tabela vem cada resultado. Nesse caso faça isso:

SELECT id, email, origem FROM (
    SELECT id, email, 1 origem FROM tabela1
    UNION
    SELECT id, email, 2 origem FROM tabela2
) t
WHERE email IN ('fdsfds@fdsf.com', 'dassadaasd@tox123dsdsa.com')
GROUP BY email

 

Assim iria retornar 3 colunas: id, email e origem. Origem seria sempre 1 ou 2, baseado na tabela de origem dos dados.

Editado por Matheus Tavares
Complementar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu pena ajuda pessoal, mas não rolou....

É tenso pegar sistema zuado feito por outra pessoa, dar uma dor de cabeça arrumar as coisas sem ter que alterar as estrutura da base de dados.

 

Enfim foi o jeito fazer o select em cada tabela, naquela que tem o valor executo o que tenho de fazer...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não faz sentido não ter resolvido conforme os dois exemplos. São exemplos funcionais e fazem o que foi solicitado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.