Rodrigo1 0 Denunciar post Postado Agosto 4, 2008 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
cassitos 2 Denunciar post Postado Agosto 4, 2008 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
cassitos 2 Denunciar post Postado Agosto 4, 2008 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
Rodrigo1 0 Denunciar post Postado Agosto 4, 2008 Cara... mto agradecido mesmo.... vou testar aqui e volto a postar! Compartilhar este post Link para o post Compartilhar em outros sites
Rodrigo1 0 Denunciar post Postado Agosto 4, 2008 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
Rodrigo1 0 Denunciar post Postado Agosto 4, 2008 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
cassitos 2 Denunciar post Postado Agosto 4, 2008 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
cassitos 2 Denunciar post Postado Agosto 4, 2008 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
Rodrigo1 0 Denunciar post Postado Agosto 4, 2008 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
cassitos 2 Denunciar post Postado Agosto 5, 2008 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.emailp/ 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_idficando só com omail.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
Rodrigo1 0 Denunciar post Postado Agosto 5, 2008 O que seria este AS mailtemp? que vem logo depois do select e antes do inner join Compartilhar este post Link para o post Compartilhar em outros sites
cassitos 2 Denunciar post Postado Agosto 5, 2008 é só um alias para a consulta feita na subquery, que nem é feito em consultas básicas. ex: SELECT tabela.* FROM nomedatabela as tabelaa ú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
cassitos 2 Denunciar post Postado Agosto 5, 2008 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
Rodrigo1 0 Denunciar post Postado Agosto 5, 2008 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
Rodrigo1 0 Denunciar post Postado Agosto 5, 2008 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
cassitos 2 Denunciar post Postado Agosto 5, 2008 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
Rodrigo1 0 Denunciar post Postado Agosto 6, 2008 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
Rodrigo1 0 Denunciar post Postado Agosto 12, 2008 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
cassitos 2 Denunciar post Postado Agosto 12, 2008 beleza! isso ae cara http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites