Jump to content
Fivewin Brasil

Update de varios registros de uma mesma tabela


marcioe

Recommended Posts

Olá amigos, boa noite

Me ocorreu a seguinte dúvida

Tenho uma rotina de conferencia, tipo assim a estrutura
tabela     pontuacao

ID, MARCADOS, ACERTOS, NAO_ACERTOS, PONTOS

Essa tabela pontuacao tem uns 5000 registros, dai ela fica lenta a atualiza o acertos e nao acertos, pois hoje estou fazendo com um do while para gravar os campos 

NUMEROS_ACERTADOS ,NUMEROS_NAO_ACERTADOS,PONTUACAO, ID 

mas está fazendo um a um, queria fazer em LOTES, A CADA 100 ou a cada 500

OU SEJA UM update EM lote

A ideia de forma que queria seria isso a um certo contador de numero eu daria o Update no lote de dados

UPDATE numeros_apostados SET NUMEROS_ACERTADOS = T_ACERTOS,NUMEROS_NAO_ACERTADOS= T_NAO_ACERTO,PONTUACAO = T_PONTUACAO WHERE ID	= 1 LIMIT 1
UPDATE numeros_apostados SET NUMEROS_ACERTADOS = T_ACERTOS,NUMEROS_NAO_ACERTADOS= T_NAO_ACERTO,PONTUACAO = T_PONTUACAO WHERE ID	= 2 LIMIT 1
UPDATE numeros_apostados SET NUMEROS_ACERTADOS = T_ACERTOS,NUMEROS_NAO_ACERTADOS= T_NAO_ACERTO,PONTUACAO = T_PONTUACAO WHERE ID	= 3 LIMIT 1
UPDATE numeros_apostados SET NUMEROS_ACERTADOS = T_ACERTOS,NUMEROS_NAO_ACERTADOS= T_NAO_ACERTO,PONTUACAO = T_PONTUACAO WHERE ID	= 4 LIMIT 1
UPDATE numeros_apostados SET NUMEROS_ACERTADOS = T_ACERTOS,NUMEROS_NAO_ACERTADOS= T_NAO_ACERTO,PONTUACAO = T_PONTUACAO WHERE ID	= 5 LIMIT 1
UPDATE numeros_apostados SET NUMEROS_ACERTADOS = T_ACERTOS,NUMEROS_NAO_ACERTADOS= T_NAO_ACERTO,PONTUACAO = T_PONTUACAO WHERE ID	= 6 LIMIT 1
UPDATE numeros_apostados SET NUMEROS_ACERTADOS = T_ACERTOS,NUMEROS_NAO_ACERTADOS= T_NAO_ACERTO,PONTUACAO = T_PONTUACAO WHERE ID	= ....... LIMIT 1
UPDATE numeros_apostados SET NUMEROS_ACERTADOS = T_ACERTOS,NUMEROS_NAO_ACERTADOS= T_NAO_ACERTO,PONTUACAO = T_PONTUACAO WHERE ID	= 500 LIMIT 1

 

 

Link to comment
Share on other sites

nao consigo entender com base nos seus update...  esse ID tem na tabela de provas e resposta?

veja um exemplo de um update com base em resultado em outra tabela:

UPDATE db1.comh SET comh.tip_comh = (SELECT forn.tip_forn FROM db0.forn WHERE forn.cod_forn = comh.for_comh) where comh.sr_recno != 0;
pode ser que ajude, pois nao entendi o que o amigo quer

Link to comment
Share on other sites

Eu preciso fazer o UPDATE fica mais rápido essa é a questão central
Imagina que eu então estivesse atualizando o saldo de estoque.

Eu teria que ler a tabela de produtos, somar as vendas, somar as saidas, dai teria o saldo, e que esse saldo apurado fosse para a tabela de produtos, porem essa tabela de produtos é muito grande tem cerca de 50.000 itens diferentes.

Se fizer a atualização de um em UM demora pois o servidor é WEB está hospedado na HOSTGATOR

Fazer um UPDATE PRODUTO 1, PRODUTO 2, ETC... fica muito lento 


Queria fazer de uns 1000 em mil, ou seja montaria o scrip e a cada 1000 produtos eu atualizaria

Seria isso a minha a minha ideia...

 

Link to comment
Share on other sites

Pessoal o comando que queria executar seria algo assim 
 

 UPDATE numeros_apostados SET  NUMEROS_ACERTADOS 			= '02|07|                                            ', NUMEROS_NAO_ACERTADOS		= '01|03|04|05|06|08|09|99|                          ', PONTUACAO		  				= '          2' WHERE ID		 	   		= '          1' LIMIT 1 ;
 UPDATE numeros_apostados SET  NUMEROS_NAO_ACERTADOS		= '73|11|25|93|61|97|77|92|31|74                     ' WHERE ID		 	   		= '          2' LIMIT 1 ;
 UPDATE numeros_apostados SET  NUMEROS_ACERTADOS 			= '07|54|02|                                         ', NUMEROS_NAO_ACERTADOS		= '57|32|40|88|14|20|95|                             ', PONTUACAO		  				= '          3' WHERE ID		 	   		= '          3' LIMIT 1 ;
 UPDATE numeros_apostados SET  NUMEROS_ACERTADOS 			= '66|65                     |                       ', NUMEROS_NAO_ACERTADOS		= '30|28|58|38|01|73|56|76|                          ', PONTUACAO		  				= '          2' WHERE ID		 	   		= '          4' LIMIT 1 ;
 UPDATE numeros_apostados SET  NUMEROS_ACERTADOS 			= '89|                                               ', NUMEROS_NAO_ACERTADOS		= '08|72|58|21|27|03|85|97|69|                       ', PONTUACAO		  				= '          1' WHERE ID		 	   		= '          5' LIMIT 1 ;
 UPDATE numeros_apostados SET  NUMEROS_ACERTADOS 			= '66|07|22|                                         ', NUMEROS_NAO_ACERTADOS		= '11|08|40|15|32|72|74|                             ', PONTUACAO		  				= '          3' WHERE ID		 	   		= '          6' LIMIT 1 ;
 UPDATE numeros_apostados SET  NUMEROS_ACERTADOS 			= '96|07|54                     |                    ', NUMEROS_NAO_ACERTADOS		= '93|31|90|51|98|44|37|                             ', PONTUACAO		  				= '          3' WHERE ID		 	   		= '         11' LIMIT 1 ;
 UPDATE numeros_apostados SET  NUMEROS_NAO_ACERTADOS		= '45|83|82|93|49|61|37|85|40|71                     ' WHERE ID		 	   		= '         13' LIMIT 1 ;
 UPDATE numeros_apostados SET  NUMEROS_ACERTADOS 			= '02|07                     |                       ', NUMEROS_NAO_ACERTADOS		= '86|85|24|99|95|73|44|39|                          ', PONTUACAO		  				= '          2' WHERE ID		 	   		= '         14' LIMIT 1 ;
 UPDATE numeros_apostados SET  NUMEROS_ACERTADOS 			= '65|89                     |                       ', NUMEROS_NAO_ACERTADOS		= '76|88|11|82|57|28|35|08|                          ', PONTUACAO		  				= '          2' WHERE ID		 	   		= '         16' LIMIT 1 ;
 UPDATE numeros_apostados SET  NUMEROS_ACERTADOS 			= '23|                                               ', NUMEROS_NAO_ACERTADOS		= '91|38|46|13|20|58|49|18|27|                       ', PONTUACAO		  				= '          1' WHERE ID		 	   		= '         18' LIMIT 1 ;

Precisava Executar de uma só vez esse Bloco

 

 

Se executo esse comando pelo PHPMYADMIN, ou pelo mysqlfront roda de boa
Já na aplicação nao roda...

 

Link to comment
Share on other sites

Veja o está aparecendo no SQLLOG 

SQLLIB/1000: MySQL RDD: Commands out of sync; you can't run this command now
18/04/2018 18:13:01  UPDATE numeros_apostados SET  NUMEROS_ACERTADOS 			= '34|02|                                            ', NUMEROS_NAO_ACERTADOS		= '69|14|81|15|59|52|61|30|                          ', PONTUACAO		  				= '          2' WHERE ID		 	   		= '         19' LIMIT 1 ;
 UPDATE numeros_apostados SET  NUMEROS_ACERTADOS 			= '89|23|                                            ', NUMEROS_NAO_ACERTADOS		= '71|44|49|06|69|13|51|25|                          ', PONTUACAO		  				= '          2' WHERE ID		 	   		= '         23' LIMIT 1 ;
 UPDATE numeros_apostados SET  NUMEROS_ACERTADOS 			= '55|                                               ', NUMEROS_NAO_ACERTADOS		= '87|64|85|37|88|76|63|44|76|                       ', PONTUACAO		  				= '          1' WHERE ID		 	   		= '         34' LIMIT 1 ;
 UPDATE numeros_apostados SET  NUMEROS_ACERTADOS 			= '89|12|                                            ', NUMEROS_NAO_ACERTADOS		= '62|51|67|95|18|14|08|73|                          ', PONTUACAO		  				= '          2' WHERE ID		 	   		= '         38' LIMIT 1 ;
 UPDATE numeros_apostados SET  NUMEROS_ACERTADOS 			= '34|                                               ', NUMEROS_NAO_ACERTADOS		= '51|32|90|26|13|80|37|45|35|                       ', PONTUACAO		  				= '          1' WHERE ID		 	   		= '         40' LIMIT 1 ;
 UPDATE numeros_apostados SET  NUMEROS_ACERTADOS 			= '65|22|                                            ', NUMEROS_NAO_ACERTADOS		= '85|10|52|93|30|51|68|19|                          ', PONTUACAO		  				= '          2' WHERE ID		 	   		= '         41' LIMIT 1 ;
 UPDATE numeros_apostados SET  NUMEROS_ACERTADOS 			= '96|66|23|                                         ', NUMEROS_NAO_ACERTADOS		= '10|49|71|32|14|57|94|                             ', PONTUACAO		  				= '          3' WHERE ID		 	   		= '         42' LIMIT 1 ;
 UPDATE numeros_apostados SET  NUMEROS_ACERTADOS 			= '65|                                               ', NUMEROS_NAO_ACERTADOS		= '35|58|18|46|08|26|85|45|05|                       ', PONTUACAO		  				= '          1' WHERE ID		 	   		= '         43' LIMIT 1 ;

 

 

Link to comment
Share on other sites

Eu entendi o que vc precisa... Vc precisa que no mesmo registro contenha concatenado os numeros que a pessoa acertou e os numeros que ela errou...Da forma concatenada acredito que é impossivel vc resolver tudo em um UPDATE, tem que fazer UPDATE registro a registro...

Talvez o melhor seja mudar a sua estrutura de tabela para uma outra lógica, tem essa possibilidade ou nao?

 

 

Link to comment
Share on other sites

Se tiver a possibilidade vc pode fazer algo assim: (estou considerando que a pessoa escolhe 10 números)

Tenha 10 Campos (colunas) chamadas ACERTO01, ACERTO02, ACERTO03, ..., ACERTO10

Daí vc faz o seguinte:

// neste array aNumeros contem os numeros sorteados

For nI := 1 to Len(aNumeros)

   cCampo1 := "ACERTO"+StrZero(nI,2)

   cCampo2 := "PONTO"+StrZero(nI,2)

cUpdate := "UPDATE numeros_apostados SET  "+cCampo1+"    = '"+StrZero(aNumeros[nI],2)+"', "+;
                                         cCampo2+" = 1 "+;
                                                      "WHERE NUMERO LIKE NUMEROS_APOSTADOS LIKE '%'+StrZero(aNumeros[nI],2)+'%'"

Next

UPDATE numeros_apostados SET PONTUACAO = PONTOS01+PONTOS02+PONTOS03+PONTOS04+PONTOS05+PONTOS06+PONTOS07+PONTOS08+PONTOS09+PONTOS10

 

Da uma adaptada para o que vc precisa, mas a logica seria essa... Primeiro gravar em campos sequencias os numeros que ele acertou e depois somar a pontuacao

 

 

Link to comment
Share on other sites

Obrigado a Todos os amigos que se empenharam em me ajudar, em especial ao amigo JOAO BOSCO de BH que me passou a formula mágica..

a qual compartilho com voces.

 

A solução é até simples, criei uma tabela "temporaria" e insiro os registros, apurandos

Apos é feito um update com o inner join 100 % Rápido.

Fica a dica

 

 

			*-------------------------------------------------------------
		   TXT_cQuery := Left(TXT_cQuery,Len(TXT_cQuery)-1)  // Para retirar a Ultima ","					
		   *----------------------------------------------------------------
			BEGIN TRANSACTION
				cQuery_Mtabela  := 						"INSERT INTO numeros_processados ( "
				cQuery_Mtabela	 := cQuery_Mtabela + " ID"
				cQuery_Mtabela	 := cQuery_Mtabela + ",NUMEROS_ACERTADOS"
				cQuery_Mtabela	 := cQuery_Mtabela + ",NUMEROS_NAO_ACERTADOS"
				cQuery_Mtabela	 := cQuery_Mtabela + ",PONTUACAO"
				cQuery_Mtabela	 := cQuery_Mtabela +	" ) VALUES " + TXT_cQuery + " "
				sql execute( cQuery_Mtabela )
				SQL EXECUTE('COMMIT')	
		   END TRANSACTION 
		   *----------------------------------------------------------------------
		   * Atualizando Dados no Servidor
		   *----------------------------------------------------------------------
  			BEGIN TRANSACTION
				cQuery_Mtabela  := 						' Update  numeros_apostados as a  '
				cQuery_Mtabela	 := cQuery_Mtabela + ' inner join numeros_processados as b on a.ID = b.ID  '
				cQuery_Mtabela	 := cQuery_Mtabela + ' set a.numeros_acertados = b.numeros_acertados, a.NUMEROS_NAO_ACERTADOS = b.NUMEROS_NAO_ACERTADOS, a.PONTUACAO = b.PONTUACAO '
				cQuery_Mtabela	 := cQuery_Mtabela + ' WHERE a.ID_CONCURSO = ' + TRANSFORMA_SQL(o_Var_Concurso,'N',11,0)
				sql execute( cQuery_Mtabela )
				SQL EXECUTE('COMMIT')	
		   END TRANSACTION 

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...