Luiz Fernando Posted June 10, 2018 Report Share Posted June 10, 2018 Pessoal veja se alguém pode me ajudar neste select estava usando desta forma no sistema, individual codigo a codigo. cSql:="SELECT codigo,saldo,sql_rowid" cSql+=" FROM kardex" cSql+=" WHERE codigo='"+cCodigo+"'" cSql+=" AND setor='"+cSetor+"'" cSql+=" ORDER BY sql_rowid desc LIMIT 1" // SR_RECNO LIMIT 1" Mais preciso mudar a logica e pegar estas informação em bloco(varios codigo de uma unica vez), não posso mais usar o LIMIT, preciso que venha o ultima lançamento por codigo cSql:="SELECT codigo,saldo,sql_rowid" cSql+=" FROM kardex" cSql+=" WHERE codigo IN ("+ cProdutos + ")" cSql+=" AND setor='"+aKardex[1,6]+"'" cSql+=" ORDER BY codigo,sql_rowid DESC" // SR_RECNO LIMIT 1" cSql+=" GROUP BY codigo" Obg Luiz Fernando Quote Link to comment Share on other sites More sharing options...
kleyber Posted June 10, 2018 Report Share Posted June 10, 2018 Luiz, Nessa tabela o código é único? Se sim, não precisa usar o GROUP BY. Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted June 10, 2018 Author Report Share Posted June 10, 2018 Luiz, Nessa tabela o código é único? Se sim, não precisa usar o GROUP BY. Ola Kleber não é unico, se fosse único estaria fácil, nesta tabela fica todo movimento da mercadoria(campo codigo) preciso pegar apenas o ultimo lançamento de cada codigo. Obg Luiz Fernando Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted June 11, 2018 Author Report Share Posted June 11, 2018 Consegui fazer o select aqui, ficou desta forma cSql:="SELECT codigo,saldo,sql_rowid FROM cSql+=" (SELECT codigo,saldo,sql_rowid FROM kardex WHERE setor ='"+aKardex[1,6]+"'" cSql+=" AND codigo IN ('000125','000126','000128'))AS t1," cSql+=" (SELECT MAX(sql_rowid)AS sql_rowid1 FROM kardex WHERE setor ='"+aKardex[1,6]+"'" cSql+=" AND codigo IN ('000125','000126','000128') GROUP BY codigo)AS t2" cSql+=" WHERE t1.sql_rowid=t2.sql_rowid1" Estes sub select é o bicho rsrsrs Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted June 12, 2018 Author Report Share Posted June 12, 2018 Consegui fazer o select aqui, ficou desta forma cSql:="SELECT codigo,saldo,sql_rowid FROM cSql+=" (SELECT codigo,saldo,sql_rowid FROM kardex WHERE setor ='"+aKardex[1,6]+"'" cSql+=" AND codigo IN ('000125','000126','000128'))AS t1," cSql+=" (SELECT MAX(sql_rowid)AS sql_rowid1 FROM kardex WHERE setor ='"+aKardex[1,6]+"'" cSql+=" AND codigo IN ('000125','000126','000128') GROUP BY codigo)AS t2" cSql+=" WHERE t1.sql_rowid=t2.sql_rowid1" Estes sub select é o bicho rsrsrs Pessoal o script acima faz o que preciso, mais ele ficou muito mais muito lendo mesmo. sera que nimguem teria uma outra solução para eyu fazer este select Obs Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted June 13, 2018 Author Report Share Posted June 13, 2018 Normalmente todos select lendo no sistema consigo contornar mais este não esta facil, abaixo consegui melhorar um pouco ele, mais mesmo assim esta devagar. SELECT k.codigo,k.saldo,k.sql_rowid FROM kardex k INNER JOIN (SELECT MAX(sql_rowid) AS sql_rowid FROM kardex WHERE setor ='02' AND codigo IN ('029163','000493','011813') GROUP BY codigo) groupedk ON k.sql_rowid = groupedk.sql_rowid Quote Link to comment Share on other sites More sharing options...
evandro Posted June 13, 2018 Report Share Posted June 13, 2018 Olá, Tente assim: create TEMPORARY table temp01 SELECT codigo, MAX(sql_rowid) AS sql_rowid FROM kardex WHERE setor ='02' AND codigo IN ('029163','000493','011813') GROUP BY codigo; create INDEX codigo ON temp01 (codigo); SELECT k.codigo,k.saldo,k.sql_rowid FROM kardex k INNER JOIN temp01 as t1 ON k.sql_rowid = t1.sql_rowid; Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted June 13, 2018 Author Report Share Posted June 13, 2018 Olá, Tente assim: create TEMPORARY table temp01 SELECT codigo, MAX(sql_rowid) AS sql_rowid FROM kardex WHERE setor ='02' AND codigo IN ('029163','000493','011813') GROUP BY codigo; create INDEX codigo ON temp01 (codigo); SELECT k.codigo,k.saldo,k.sql_rowid FROM kardex k INNER JOIN temp01 as t1 ON k.sql_rowid = t1.sql_rowid; Evandro obg pela resposta, mais o comando max() qdo se tem vários registro não da certo, foi a primeira coisa que tentei aqui, ele não traz o ultimo registro daquele código. Obg Quote Link to comment Share on other sites More sharing options...
evandro Posted June 13, 2018 Report Share Posted June 13, 2018 Olá, É exatamente o subselect. Tem de funcionar da mesma forma. Apenas em vez de ser uma query, fica desmembrada em 2 ( 3 no caso de criar o índice ). Quote Link to comment Share on other sites More sharing options...
ecob Posted June 13, 2018 Report Share Posted June 13, 2018 Evandro obg pela resposta, mais o comando max() qdo se tem vários registro não da certo, foi a primeira coisa que tentei aqui, ele não traz o ultimo registro daquele código. Obg Luiz, tem certeza? Nesse exemplo do Evandro é pra funcionar sim, pois ele está agrupando por código e fazendo MAX no SQL_ROWID, ou seja, vai pegar o maior row_id daquele código, consequentemente, o último registro, já que o sql_rowid é uma PK auto incremento. Evandro, você pode criar o índice direto no seu CREATE TEMPORARY TABLE: CREATE TEMPORARY table temp01 (INDEX IDX_01(CODIGO)) SELECT codigo AS COD, MAX(sql_rowid) AS RECNO FROM kardex WHERE setor ='02' AND codigo IN ('029163','000493','011813') GROUP BY codigo; SELECT codigo,saldo,sql_rowid FROM kardex INNER JOIN temp01 ON sql_rowid = RECNO; Att Erciley Coimbra Quote Link to comment Share on other sites More sharing options...
ecob Posted June 13, 2018 Report Share Posted June 13, 2018 Creio que só assim, dê certo também, veja: SELECT CODIGO,SALDO,SQL_ROWID FROM KARDEX INNER JOIN (SELECT MAX(SQL_ROWID) AS RECNO FROM KARDEX WHERE SETOR = @SETOR AND CODIGO IN ('000125','000126','000128') GROUP BY CODIGO ) AS S1 ON RECNO = SQL_ROWID; Luiz Fernando 1 Quote Link to comment Share on other sites More sharing options...
evandro Posted June 13, 2018 Report Share Posted June 13, 2018 Olá, O problema pode ser velocidade. Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted June 13, 2018 Author Report Share Posted June 13, 2018 Pessoal comecei a testar o select abaixo nos servidores de alguns clientes meus e foi super rápido, tipo num caso aqui demorou coisa de milésimo de segundo, já no meu 2 minutos e 51 segundos, mais o problema estava na seguinte situação, meu note foi formatado semana passada, e na instalação do mysql, fiz tudo default, e o correto é colocar o mysql como dedicado, agora a rotina esta voando, obg a atenção de todos, ECOB testei seu select e o resultado veio certo tb, mais uma forma de fazer isto , obg. SELECT k.codigo,k.saldo,k.sql_rowid FROM kardex k INNER JOIN (SELECT MAX(sql_rowid) AS sql_rowid FROM kardex WHERE setor ='02' AND codigo IN ('029163','000493','011813','000611','023617','013999','015571','036581','019025','027435' ,'027377','012925','027862','027862','015815','015815','037495','022816','000135','019154' ,'000200','034795','001168','001168','000442','000588','000867','000076','000391','000073','000867') GROUP BY codigo) groupedk ON k.sql_rowid = groupedk.sql_rowid 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.