Foccos 6 Denunciar post Postado Janeiro 6, 2014 Estou com uma dúvida para realizar a remoção de registros na tabela exceto o primeiro registro, eu consigo fazer o select dos registros normalmente mas não o delete. SELECT * FROM boleto WHERE id_inq = '2' AND id > (SELECT id FROM boleto ORDER BY id LIMIT 1) Como faço pra poder excluir todos os registros com id 2 por exemplo, exceto o primeiro registro dessa condição? Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Janeiro 6, 2014 Você já tem meio caminho andado, os registros que quer apagar, agora basta apagá-los: DELETE FROM boleto WHERE id IN ( SELECT id FROM boleto WHERE id_inq = '2' AND id > (SELECT id FROM boleto ORDER BY id LIMIT 1) ) Você também pode fazer desse modo: DELETE FROM boleto WHERE id_inq = '2' AND id > (SELECT id FROM boleto ORDER BY id LIMIT 1) Utilize transactions e/ou faço um backup para evitar problemas em apagar algum registro inesperado. Compartilhar este post Link para o post Compartilhar em outros sites
Foccos 6 Denunciar post Postado Janeiro 6, 2014 Gabriel , fui realizar uma remoção de teste direto no phpmyadmin , ele me retornou o seguinte erro: #1093 - You can't specify target table 'boleto' for update in FROM clause Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Janeiro 6, 2014 Esse é um problema do MySQL (estou acostumado com outros SGBDs) onde não se pode utilizar um sub select da tabela que quer se modificar. Utilize o segundo delete que lhe mandei. Compartilhar este post Link para o post Compartilhar em outros sites
Foccos 6 Denunciar post Postado Janeiro 6, 2014 Testei com os 2 DELETES e retornaram o mesmo erro, pensei em uma solução mas utilizaria mais processos e não sei se seria viável que é a seguinte, eu realizo o SELECT e guardo em uma tabela temporária, depois eu faria um DELETE na tabela e apagava esses registros selecionados, e depois inseria esse registro temporário de volta. Você tem alguma outra sugestão? Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Janeiro 6, 2014 A tabela temporária é uma solução, mas você também pode usar variáveis no MySQL. SET @id = (SELECT id FROM boleto ORDER BY id LIMIT 1); DELETE FROM boleto WHERE id_inq = '2' AND id > @id; Em teoria funciona. Não consigo testar no momento. Se essa query for recorrrente, crie uma procedure e apenas execute-a. Você poderá utilizar o id_inq como parâmetro para flexibilizar a execução. Compartilhar este post Link para o post Compartilhar em outros sites
Foccos 6 Denunciar post Postado Janeiro 6, 2014 Funcionou, deu certo assim , muito obrigado ... Compartilhar este post Link para o post Compartilhar em outros sites
Fernando C 128 Denunciar post Postado Janeiro 6, 2014 remoção de registros na tabela exceto o primeiro registro teste primeiro com esse comando: select * from TABELA where id >= 2 se for realmente isso que vc deseja: Delete from TABELA where id >= 2 caso vc não saiba qual é esse id, vc pode usar uma subconsulta: select * from TABELA where id not in(select min(id) from tabela) Compartilhar este post Link para o post Compartilhar em outros sites
Foccos 6 Denunciar post Postado Janeiro 6, 2014 Fernando C , esse comando funcionaria caso fossem todos os registros da tabela, mas no meu caso são todos os registros da tabela limitados por um determinado usuário, que vem pela chave estrangeira id_inq , eu preciso remover todos exceto o primeiro somente desse usuário específico. A solução do Gabriel me atendeu, mesmo assim obrigado pela resposta ... Compartilhar este post Link para o post Compartilhar em outros sites
Fernando C 128 Denunciar post Postado Janeiro 6, 2014 são todos os registros da tabela limitados por um determinado usuário ah, ta.. nesse caso precisa adicionar a outra condição, c/ certeza.. :thumbsup: Compartilhar este post Link para o post Compartilhar em outros sites
Foccos 6 Denunciar post Postado Janeiro 8, 2014 Só complementando ... talvez ajude mais alguém, eu precisava alterar o primeiro registro dessa pesquisa e remover o restante deles, o meu SQL ficou assim: // Ele verifica qual o primeiro registro SET @id = (SELECT id FROM boleto ORDER BY id LIMIT 1); // Remove todos os registros do id indicado menos o primeiro. DELETE FROM boleto WHERE id_inq = '2' AND id > @id; // Altera o valor desse primeiro registro que sobrou UPDATE boleto SET valor_boleto = 777 WHERE id_inq = '2' Coloquei os valores fixos como exemplo, mas todos os valores utilizei variáveis ... Compartilhar este post Link para o post Compartilhar em outros sites
Fernando C 128 Denunciar post Postado Janeiro 9, 2014 SELECT id FROM boleto ORDER BY id LIMIT 1 só 1 obs: se id for uma chave primária, vc pode usar tb max(id) ou min(id)(funções de agregação), pq nem todo banco trabalha com a cláusula limit.. Compartilhar este post Link para o post Compartilhar em outros sites
Foccos 6 Denunciar post Postado Janeiro 10, 2014 Entendi , usarei das próximas vezes , muito obrigado Fernando ... Compartilhar este post Link para o post Compartilhar em outros sites