halfar 5 Denunciar post Postado Setembro 16, 2013 dá para realizar um update utilizando a clausula limit?? tentei fazer assim: $sql_update = "update cadas_email set enviado = '" . $status . "', data= '" . $xdata . "' limit 0,20"; mas da erro de script se tirar a clausula limit , então funciona.... Compartilhar este post Link para o post Compartilhar em outros sites
shini 318 Denunciar post Postado Setembro 16, 2013 teoricamente a clausula where seria o limit, lembre que um update sem where vai atualizar a tabela inteira. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Setembro 16, 2013 Limit não faz sentido para update ... Ao menos para mim. Qual a razão de só atualizar os N primeiros registros de uma tabela e os outros não ?! mas tente algo assim os "limitados" select chave from tabela limit 0,20 "updatando" .... update tabela set campo1 = '123' where chave in (select chave from tabela limit 0,20) Compartilhar este post Link para o post Compartilhar em outros sites
halfar 5 Denunciar post Postado Setembro 16, 2013 bem, fiz como sugeriu, mas o mysql retornou erro informando que a versao do mysql nao aceita subquery... erroThis version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' Fiz com a clausula where, e sem a clausula where também, em ambos os casos retorna o mesmo erro. mas deixa eu explicar o que preciso, talvez exista uma solução mais apropriada. tenho um banco de dados cadastrado com endereços de emails... quando o script é executado, é enviado os 20 primeiros emails do banco de dados. E preciso deixar informado no bd que os tais 20 primeiros emails ja foram enviados, para que nao ocorra de ser enviado novamente. então inicialmente é selecionado os 20 primeiros registros de acordo com uma clausula where que pega somente os emails que ainda nao foram enviados. $sql_mail = "select * from cadas_email where enviado = '" . $status . "' limit 0,20"; o campo ENVIADO no momento está com "nao", ou seja o email NAO foi enviado. Então este registro será selecionado para envio. Então, apos enviar o email, preciso alterar o campo ENVIADO para "sim", ou seja, email ja foi enviado, e não será mais selecionado para um novo envio. Então teoricamente, da mesma forma como selecionei os 20 primeiros registros para envio do email, então bastaria um update nas mesmas condições do SELECT. $sql_update ="update cadas_email set enviado = '" . $status . "' , data = '" . $xdata . "' limit 0,20"; Por esta razão é que estou fazendo update nos 20 primeiros registros...Pela logica, se foi selecionado os 20 primeiros registros do banco de dados, então um update nos 20 primeiros registros resolveria a questao. Bem, Motta, eu também fiquei meio duvidoso, pois um update sem a clausula where pode danar o banco de dados. Mas aí está um caso que não tem como utilizar a clausula where, e se não der para utilizar a clausula LIMIT num update, então fica complicado Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Setembro 16, 2013 Uma solução 1) Faça um cursor (select) que retorne a chave da tabela e o email a ser enviado (demais campos se preciso) 2) Em em loop deste cursor __2.1) Mande o email __2.2) Faça o update com base na chave 3) Para se chegar a X emitidos ou fim do Cursor. Compartilhar este post Link para o post Compartilhar em outros sites
shini 318 Denunciar post Postado Setembro 16, 2013 pelo php pegue o id desses clientes, e rode um update com IN. update tabela set enviado = 'sim' WHERE id in (id1, id2, id3) Compartilhar este post Link para o post Compartilhar em outros sites
halfar 5 Denunciar post Postado Setembro 16, 2013 consegui fazer funcionar. dei uma pesquisada no manual do Mysql e achei algo. achei estes dois exemplos: UPDATE busstops SET pos = ( SELECT @pos := @pos +1 ), route =1 WHERE id IN (5,7,8,9) UPDATE busstops SET pos = ( SELECT @pos := @pos +1 ) WHERE route = 1 ORDER BY pos ASC então fiz uma adaptação, que funcionou, mas confesso que ficou um codigo redundante, repetitivo: $sql_update ="update cadas_email set enviado = '" . $status_atual . "', data = '" . $xdata . "' and enviado = (select enviado = '" . $status_anterior . "'), data = '" . $xdata . "' where enviado = '" . $status_anterior . "'"; achei que o codigo está repetitivo pela seguinte razão: note que dentro do parenteses já existe ali uma condição enviado=$status anterior. Pra que a clausula where? Ela não faz a mesma coisa? E o campo data ja foi setado com o valor da data no inicio da clausula, mas note que no final da clausula tive que repetir a mesma informação. Tentei suprimir as informações repetitivas, mas não teve jeito, não dá nenhum erro no script, mas não faz as alterações corretamente. Se suprimir uma das condições, o campo data por exemplo, no banco de dados a data fica zerada... achei este codigo meio estranho, mas funcionou,,,, e isto é o mais importante.. Compartilhar este post Link para o post Compartilhar em outros sites