Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Rodrigo1

Remover duplicidade de emails

Recommended Posts

Ae galera do mysql!

Eu quase nao post aqui...

 

To com um problema de registros com duplicidade e preciso eliminalos da minha tabela

 

Alguem pode me ajudar por favor?

Compartilhar este post


Link para o post
Compartilhar em outros sites

oi...

no seu outro post tem uma parte da explicação daquelas consultas que você perguntou.

eu peguei um exemplo daquele e fiz uma stored procedure para remover os registros duplicados (seguindo o exemplo).

DELIMITER $$

CREATE
	PROCEDURE `sp_removeDup`()
	BEGIN
		#STORED PROCEDURE  para remover registros duplicados, deixar só o último cadastrado de cada ocorrência
		DECLARE idMax INT(11) DEFAULT 0; #o último código do ID daquele nome e sobrenome
		DECLARE semReg INT(1) DEFAULT 0; #um indicador para saber se ainda tem registro no cursor
		DECLARE nomeDup VARCHAR(50) DEFAULT NULL; #nome duplicado
		DECLARE sobrenomeDup  VARCHAR(50) DEFAULT NULL; #sobrenome duplicado
		#Este é o cursor responsável pela leitura dos nomes e sobrenomes duplicados
		DECLARE curDup CURSOR FOR select nome,sobrenome, max(id) as id
								  from pessoas 
								  group by nome,sobrenome
								  having count(*) > 1;
		#nosso tratamento de erro caso chegue ao final do cursor (não encontre mais registros)
		DECLARE CONTINUE HANDLER FOR NOT FOUND SET semReg := 1;
		OPEN curDup; #abre o cursor para leitura
		REPEAT 
			#faz a leitura do cursor gravando o valor dos campos do SELECT do cursor nas variáveis (NA ORDEM CERTA)
			FETCH curDup INTO nomeDup,sobrenomeDup,idMax;
			IF semReg = 0 THEN #caso tenha encontrado registro no cursor
				#remove os registros cujo o ID seja menor que o último ID do nome e sobrenome
				#repare que no WHERE só o ID não é útil, pois se deixar só ele pode remover registros que não deveria
				DELETE FROM pessoas WHERE id < idMax AND
										  nome = nomeDup AND
										  sobrenome = sobrenomeDup;
			END IF;
			UNTIL semReg = 1 #repetir até que não encontre mais registros
		END REPEAT;
		CLOSE curDup; #fechar o cursor
		COMMIT; #comitar a transação
	END$$

DELIMITER;

Executando este código em um banco de teste, criará a stored procedure. a chamada é assim:

call sp_removeDup()

o Código está comentado para facilitar a personalização (caso use), mas se tiver dúvidas do funcionando posta ae.

 

até

Compartilhar este post


Link para o post
Compartilhar em outros sites

hummm esqueci de comentar que stored procedure só apatir da versão 4.1 do MySql.

Mais info aqui http://dev.mysql.com/doc/refman/5.0/en/sto...procedures.html.

 

se procedure não servir... talvez consiga resolver combinando aquela consulta com group by e programação de outra linguagem (que você está utilizando). fora isto não sei como seria.

 

até

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe a ignorancia..

mais como chamo a store procedure no phpMyAdmin?

 

Sou bem iniciante em BD, ainda mais em mysql!

 

opa... ja entendi..desculpe

 

Mais nao to conseguindo!

gravar a store procedure mesmo assim

Compartilhar este post


Link para o post
Compartilhar em outros sites

Algumas duvidas..

 

eu posso apenas colocar um campo onde tem nome sobrenome?

 

onde tem id é o campo id da tabela?

Compartilhar este post


Link para o post
Compartilhar em outros sites

rapaz... eu não uso o PhpMyAdmin (já usei há muito tempo, mas foi só consultas básicas).

Dei uma procurada na web e encontrei:

http://www.linhadecodigo.com.br/Artigo.aspx?id=891

http://forum.imasters.com.br/index.php?showtopic=201299

 

http://scriptbrasil.com.br/forum/index.php?showtopic=109242

 

usando o SQL Yog, eu chamo assim

call sp_removeDup()
.

 

pior que nem tenho PHPMyAdmin p/ fazer testes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom...

posta aí a estrutura da tabela que você quer remover os e-mails duplicados.

daí p/ ajustar melhor a procedure.

mas primeiro você tem que conseguir criar a procedure.

aqui eu uso SQL Yog para administrar o banco de dados, já o phpmyadmin não sei como funciona (mais).

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza cara..

vou atras desse yog...

 

você quer que eu te passe a estutura da tabela?

 

nome da tabela = listamails

campo1 - id_mail

campo2 - nome

campo3 - email

campo4 - receber

campo5 - id_cat

campo6 - status

campo7 - html

campo8 - truefalse

 

 

Preciso remover todos os registros iguais do campo email apenas

 

ps: haha... bela frase - Programar não é só profissão... é arte!(me sinto asim criando aplicacoes em asp)

Compartilhar este post


Link para o post
Compartilhar em outros sites

hummm rapaz...

reformulando aquela consulta que faz o DELETE, no seu outro post o ska_ska passou um link que deu uma luz também. ehe

 

peguei esta sua estrutura e montei aqui p/ teste e cadastrei alguns emails duplicados, depois rodei este SQL:

DELETE mail.*
FROM (
   SELECT MAX(id_mail) AS ult_id, email 
   FROM listamails
   GROUP BY email
   HAVING COUNT(*) > 1   
) AS mailtemp
INNER JOIN listamails mail ON mail.email = mailtemp.email AND
							  mail.id_mail < ult_id
:wacko:

se tiver dúvidas desta consulta aí só perguntar ehehe

 

coloquei este

mail.email = mailtemp.email

p/ evitar que registros não sejam removidos desnecessariamente, já que está comparando o id (<). imagina remover todos os email cujo o id < 20... iriam os duplicados e outros que não são e que não tem nada haver com a história...

 

se quiser remover TODOS os duplicados, basta remover este

AND mail.id_mail < ult_id
ficando só com o

mail.email = mailtemp.email

seguindo o mesmo padrão das outras consultas de deixar só 1 dos e-mails duplicados, no caso como está pegando pelo último ID, só restaria o que foi cadastrado mais recentemente, os demais serão removidos.

 

até que funcionou na boa (sem procedures). a versão do mysql que utilizei é a 5.1.

 

seria interessante você montar uma outra tabela com a mesma estrutura e fazer uns testes com esta consulta, mudando o 'listamails' para a tabela que você criar. se funcionar do jeito que precisa, basta executar esta consulta com o nome da tabela necessária.

 

ficou bem mais simples. mas talvez esta consulta possa ser melhorada apesar de estar funcionando bem.

 

não sei como é o esquema, mas seria interessante também fazer backup do seu banco antes de fazer este tipo de operação. já fui salvo várias vezes graças ao iluminado backup. http://forum.imasters.com.br/public/style_emoticons/default/grin.gif

 

até

Compartilhar este post


Link para o post
Compartilhar em outros sites

é só um alias para a consulta feita na subquery, que nem é feito em consultas básicas. ex:

SELECT tabela.* FROM nomedatabela as tabela

a única diferença aí é que este alias (mailtemp) foi feito em uma subquery.

aqui você tem uma referência de como pode fazer subqueries: http://dev.mysql.com/doc/refman/5.0/en/subqueries.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

nesta consulta que passei ele está pegando todos os registros que estão duplicados, e depois faz um INNER desta consulta (mailtemp) com a tabela de emails, pegando os registros mais antigos que estão em duplicidade em relação ao campo e-mail.

 

se puder, cria uma outra tabela com a mesma estrutura que você me passou, e cria alguns registros em duplicidade, depois roda esta consulta e veja o resultado...

 

ex: supondo que a tabela de teste seja emailteste:

DELETE mail.*

FROM (

SELECT MAX(id_mail) AS ult_id, email

FROM emailteste

GROUP BY email

HAVING COUNT(*) > 1

) AS mailtemp

INNER JOIN emailteste mail ON mail.email = mailtemp.email AND

mail.id_mail < ult_id

veja se ele vai deixar apenas 1 registros dos que estão duplicados...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Irado!

 

entendi...

estou fazendo o beckup, mais mesmo assim vou criar a tabela teste, ja volto com o resultado!

 

os cara tem q te botá pra moderador...hehe

 

ps: to mto agradecido mesmo cara!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ae cara..

peguei aquele sqlYog

você pode me dizer como fazer beckup por ele?

realmente o phpMyAdmin tem bastante restrições

Compartilhar este post


Link para o post
Compartilhar em outros sites

hummm

no Yog, depois que estiver conectado. Do lado esquerdo tem a lista de banco de dados, clica com o botão direito sobre o banco que deseja, e depois na opção 'Backup Database as SQL Dump'.

 

vai abrir uma tela com algumas opções:

Structure Only = exporta apenas a estrutura do banco (create database, create table, etc)

Data Only = exporta apenas os dados de cada tabela.

Structure and Data = exporta a estrutura e os dados.

 

E também outras opções incluindo o local onde deseja que o arquivo de backup seja criado.

 

se tiver dúvidas das outras opções só postar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entao...

O script ta rodando lindo mais sempre cai a conexao com o servidor MySql...

mais ta dando certo!

 

Beckup = ok

 

Se der aqui eu aviso pro tópico ficar completo!

 

Agradecido mesmo por enquanto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora sim mano....

 

Minha tabela nao era indexada!

 

Recomendo que todos que tenham mailing façam o proceso que eu fiz

 

Ai vai

 

1 - Indexar a tabela : ALTER TABLE tabela ADD INDEX ( campo )

que tambem aprendi aqui no forum - http://forum.imasters.com.br/index.php?showtopic=300126

 

2 - Usar o codigo do Santo cassitos

DELETE mail.*
FROM (
SELECT MAX(id_mail) AS ult_id, email
FROM emailteste
GROUP BY email
HAVING COUNT(*) > 1
) AS mailtemp
INNER JOIN emailteste mail ON mail.email = mailtemp.email AND
mail.id_mail < ult_id

Estou mto agradecido ao cassitos e a galera!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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