Jump to content
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.

Share this post


Link to post
Share on other 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í.

Share this post


Link to post
Share on other 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.

Edited by Matheus Tavares
Complementar

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.