Omar~ 87 Report post Posted July 2, 2018 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
BrunoBit 82 Report post Posted July 3, 2018 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
Matheus Tavares 167 Report post Posted July 3, 2018 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. Share this post Link to post Share on other sites
Omar~ 87 Report post Posted July 3, 2018 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
Gabriel Heming 766 Report post Posted July 3, 2018 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
BrunoBit 82 Report post Posted July 3, 2018 Que erro que deu quando você executou as querys? Share this post Link to post Share on other sites