Ir para conteúdo

POWERED BY:

Arquivado

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

halfar

update com clausula limit

Recommended Posts

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

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

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

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

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

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

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

×

Informação importante

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