como selecionar registros mysql pulando sempre um registro

MySQL

09/01/2014

Boa noite

Meus amigos estou precisando de uma força imensa!
estou precisando saber como eu faço para dar um select no mysql para selecionar os registros sempre pulando um registro.
ex:
[img:descricao=result sql]http://arquivo.devmedia.com.br/forum/imagem/335313-20140109-205029.png[/img]
seguindo a imagem acima gostaria de selecionar ( o id=1 pular o id=2 e selecionar o id=3) e assim por diante
alguem poderia me dar uma solução
Ronald Santos

Ronald Santos

Curtidas 0

Melhor post

William

William

11/01/2014

Colega vou supor que a sua tabela possui os IDs todos em sequência, pode se usar a técnica de verificar o resto da divisão (ID MOD 2) e na instrução SQL, dessa maneira se o resto da divisão for zero ele retorna somente os registros onde o ID é par e se for diferente de zero ele retorna os registros onde o ID que é ímpar.

Retorna registros com id par
SELECT SeusCampos FROM SuaTabela WHERE MOD(id, 2) = 0


Retorna registros com id ímpar
SELECT SeusCampos FROM SuaTabela WHERE MOD(id, 2) <> 0


Desse modo você consegue pular IDs, veja se atende suas necessidades!!
GOSTEI 1

Mais Respostas

Alex Lekao

Alex Lekao

09/01/2014

Ola Boa tarde!!!

Excelente a sugestao do Willian!!!

Acredito que a maneira mais pratica de identifcar pares e impares eh com o Resto de divisao!!!

GOSTEI 0
Paulo Pontes

Paulo Pontes

09/01/2014

Funciona perfeitamente, o problema é se algum id for excluído. Por exemplo se o id 2 for deletado, a consulta com resto 1 pegará o id 1 e 3. A não ser que garantam que nenhum id desta tabela seja removido.
GOSTEI 0
Alex Lekao

Alex Lekao

09/01/2014

Entao, nao sei exatamente do que se trata.

Mas eu particularmente nao gosto de exclusao de itens de tabelas.

Acho melhor que se tenha um campo onde vc possa flegar sim ou nao para cancelado, apagado, etc...

eu nao recomendo exclusoes de cadastros, por uma questao de consistencia de dados em caso necessario de relatorios, ou outras coisas.

mas isso vai de analise do banco etc.
GOSTEI 0
William

William

09/01/2014

Colega vou supor que a sua tabela possui os IDs todos em sequência, pode se usar a técnica de verificar o resto da divisão (ID MOD 2) e na instrução SQL, dessa maneira se o resto da divisão for zero ele retorna somente os registros onde o ID é par e se for diferente de zero ele retorna os registros onde o ID que é ímpar.

Retorna registros com id par
SELECT SeusCampos FROM SuaTabela WHERE MOD(id, 2) = 0


Retorna registros com id ímpar
SELECT SeusCampos FROM SuaTabela WHERE MOD(id, 2) <> 0


Desse modo você consegue pular IDs, veja se atende suas necessidades!!


Então colega webcodefree, como mencionei na minha resposta "vou supor que a sua tabela possui os IDs todos em sequência", meu código é apenas uma solução alternativa para o problema.

Trabalho diariamente com MySQLe não acredito que exista outra solução, mas estou acompanhando o tópico, quem sabe surge uma solução "mais adequada" a nível de instrução SQL!
GOSTEI 0
Paulo Pontes

Paulo Pontes

09/01/2014

Sim Willian, não fui contrário a sua solução até por que é muito plausível. Talvez seja a única solução mesmo tanto é que reforcei também sobre a chave sequencial. Também não sei a fundo se o MySQL tem como reordenar as chaves através de procedures ou gatilhos. Mas peço desculpas ai se viu meu comentário com maús olhos, não tive a intenção de ir contra seu raciocínio.
GOSTEI 0
William

William

09/01/2014

Tranquilo colega webcodefree, sem problemas de minha parte!!

Afinal estamos todos no mesmo barco .. rsrsrsrsr
GOSTEI 0
Ronald Santos

Ronald Santos

09/01/2014

Muito Obrigado mesmo camarada o seu comando resolveu o meu problema!!!!

Mais eu preciso de mas uma ajuda sua se for possível,
Eu estou precisando fazer um update pegando um valor de uma coluna de uma tabela N para uma coluna de uma tabela X sendo que sendo que o valor que eu irei pegar da tabela N é VARCHAR(255) e eu quero jogar esse valor para a coluna decimal(21,2) da tabela X!
qual a luz que você poderia me dar?

Colega vou supor que a sua tabela possui os IDs todos em sequência, pode se usar a técnica de verificar o resto da divisão (ID MOD 2) e na instrução SQL, dessa maneira se o resto da divisão for zero ele retorna somente os registros onde o ID é par e se for diferente de zero ele retorna os registros onde o ID que é ímpar.

Retorna registros com id par
SELECT SeusCampos FROM SuaTabela WHERE MOD(id, 2) = 0


Retorna registros com id ímpar
SELECT SeusCampos FROM SuaTabela WHERE MOD(id, 2) <> 0


Desse modo você consegue pular IDs, veja se atende suas necessidades!!
GOSTEI 0
William

William

09/01/2014

Uma pergunta, suponho que essa coluna em decimal seja para valores monetários, esses valores em varchar(255) também são monetários?
GOSTEI 0
William

William

09/01/2014

Uma pergunta, suponho que essa coluna em decimal seja para valores monetários, esses valores em varchar(255) também são monetários?
GOSTEI 0
William

William

09/01/2014

Colega Ronald, vou supor novamente que os valores no campo VARCHAR(255) sejam monetários, ou seja, usando a vírgula como separador decimal.

Usei 2 instruções de REPLACE() encadeadas para substituição de caracteres, no seu caso '.' por vazio '' e a ',' pelo '.', dessa maneira conseguimos evitar o trucamento de valores quando convertemos valores varchar para decimal. Lembrando que o MySQL usa o '.' como separador decimal!

Outro ponto seria capturar esses valores de outra tabela, nesse caso usei uma subquery para retornar o valor desejado, no código estou comparando os IDs senão a subquery retorna mais do que 1 linha e vai dar erro.

UPDATE TabelaX x 
SET ColunaX = (SELECT REPLACE(REPLACE(colunaN, '.', ''), ',', '.') FROM TabelaN n WHERE n.idN = x.idX)


Observe o exemplo de entrada e saída do valores abaixo.
ColunaN	     - ColunaX
VARCHAR(255) - DECIMAL(21,2)
1.123,00     - 1123.00
456,09	     - 456.09
4,90	     - 4.90
12.000,00    - 12000.00
0,90	     - 0.90
11345,90     - 11345.90


Qualquer dúvida estou a disposição ...
GOSTEI 0
Ronald Santos

Ronald Santos

09/01/2014

Boa noite meu amigo eu irei testar agora o seu comando e ja lhe aviso se funcionou?

Colega Ronald, vou supor novamente que os valores no campo VARCHAR(255) sejam monetários, ou seja, usando a vírgula como separador decimal.

Usei 2 instruções de REPLACE() encadeadas para substituição de caracteres, no seu caso '.' por vazio '' e a ',' pelo '.', dessa maneira conseguimos evitar o trucamento de valores quando convertemos valores varchar para decimal. Lembrando que o MySQL usa o '.' como separador decimal!

Outro ponto seria capturar esses valores de outra tabela, nesse caso usei uma subquery para retornar o valor desejado, no código estou comparando os IDs senão a subquery retorna mais do que 1 linha e vai dar erro.

UPDATE TabelaX x 
SET ColunaX = (SELECT REPLACE(REPLACE(colunaN, '.', ''), ',', '.') FROM TabelaN n WHERE n.idN = x.idX)


Observe o exemplo de entrada e saída do valores abaixo.
ColunaN	     - ColunaX
VARCHAR(255) - DECIMAL(21,2)
1.123,00     - 1123.00
456,09	     - 456.09
4,90	     - 4.90
12.000,00    - 12000.00
0,90	     - 0.90
11345,90     - 11345.90


Qualquer dúvida estou a disposição ...
GOSTEI 0
Ronald Santos

Ronald Santos

09/01/2014

Meu amigo me desculpa a demora para lhe retornar uma resposta
eu testei o comando que vc me passou mais deu erro

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

acima está o erro que o mysql me retornou!!!


Colega Ronald, vou supor novamente que os valores no campo VARCHAR(255) sejam monetários, ou seja, usando a vírgula como separador decimal.

Usei 2 instruções de REPLACE() encadeadas para substituição de caracteres, no seu caso '.' por vazio '' e a ',' pelo '.', dessa maneira conseguimos evitar o trucamento de valores quando convertemos valores varchar para decimal. Lembrando que o MySQL usa o '.' como separador decimal!

Outro ponto seria capturar esses valores de outra tabela, nesse caso usei uma subquery para retornar o valor desejado, no código estou comparando os IDs senão a subquery retorna mais do que 1 linha e vai dar erro.

UPDATE TabelaX x 
SET ColunaX = (SELECT REPLACE(REPLACE(colunaN, '.', ''), ',', '.') FROM TabelaN n WHERE n.idN = x.idX)


Observe o exemplo de entrada e saída do valores abaixo.
ColunaN	     - ColunaX
VARCHAR(255) - DECIMAL(21,2)
1.123,00     - 1123.00
456,09	     - 456.09
4,90	     - 4.90
12.000,00    - 12000.00
0,90	     - 0.90
11345,90     - 11345.90


Qualquer dúvida estou a disposição ...
GOSTEI 0
William

William

09/01/2014

Cole aqui exatamente o mesmo código que você está executando!!!
GOSTEI 0
Ronald Santos

Ronald Santos

09/01/2014

Meu amigo eu consegui mais com essa comando abaixo.
update reg_c490 x inner join inconsistencia n on x.id = n.id_registro_bd set x.vl_opr = replace(n.valor_esperado_campo, ',', '.') where x.cst_icms = '000';

Cole aqui exatamente o mesmo código que você está executando!!!
GOSTEI 0
William

William

09/01/2014

Funcionou da maneira como vc precisava?
GOSTEI 0
Ronald Santos

Ronald Santos

09/01/2014

Sim funcionou
eu já havia tentando com aquele script acima mais não tinha usado o replace e sempre que eu executava ele truncava todos os valores!
quando adicionei o replace funcionou perfeitamente... Muito obrigado pelo a sua ajuda!!!
Funcionou da maneira como vc precisava?
GOSTEI 0
William

William

09/01/2014

OK, estou finalizando o tópico!!!
GOSTEI 0
POSTAR