marcioe Posted April 17, 2018 Report Share Posted April 17, 2018 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 Quote Link to comment Share on other sites More sharing options...
joaosolution Posted April 18, 2018 Report Share Posted April 18, 2018 Bom dia Não entendi muito bem mas vamos lá. De onde vem os resultados T_ACERTOS, T_NAO_ACERTO e T_PONTUACAO? Att João Bosco Quote Link to comment Share on other sites More sharing options...
marcioe Posted April 18, 2018 Author Report Share Posted April 18, 2018 Esses dados vem de uma outra leitura Imagina assim uma correção de provas Exemplo (é como se fosse uma conferencia de provas) Tabela de respostas e tabela de provas Quote Link to comment Share on other sites More sharing options...
sistem Posted April 18, 2018 Report Share Posted April 18, 2018 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 Quote Link to comment Share on other sites More sharing options...
marcioe Posted April 18, 2018 Author Report Share Posted April 18, 2018 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... Quote Link to comment Share on other sites More sharing options...
marcioe Posted April 18, 2018 Author Report Share Posted April 18, 2018 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... Quote Link to comment Share on other sites More sharing options...
marcioe Posted April 18, 2018 Author Report Share Posted April 18, 2018 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 ; Quote Link to comment Share on other sites More sharing options...
kleyber Posted April 20, 2018 Report Share Posted April 20, 2018 Márcio, essa tabela é INNODB? Se for, tens que colocar esses UPDATEs dentro de uma transação, ou seja, colocar o BEGIN TRANSACTION antes deles e o END TRANSACTION logo após. Quote Link to comment Share on other sites More sharing options...
emotta Posted April 20, 2018 Report Share Posted April 20, 2018 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? Quote Link to comment Share on other sites More sharing options...
emotta Posted April 20, 2018 Report Share Posted April 20, 2018 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 Quote Link to comment Share on other sites More sharing options...
marcioe Posted April 20, 2018 Author Report Share Posted April 20, 2018 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 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.