Guardar resultado da consulta em variavel, tratá-la com replace, e usa-la como condição em outra consulta em MySQL

02/03/2016

0

Ola pessoal, esta é minha segunda pergunta que faço aqui e estou gostando bastante do forum.

É assim, tenho uma tabela de clientes no MySQL,

Em cada cliente cadastrado, temos a coluna ID que identifica o cliente, e também uma coluna chamada DEPENDENTES onde armazena os IDs de outros cadastros que são menores dependentes deste ID principal.

A questão é que na coluna DEPENDENTES podem ter varios IDs separados por virgula, representando que este cliente tem varios dependentes cadastrados no sistema, e minha necessidade é fazer um select que selecione o cliente principal e substitua as virgulas pela condição " or idCliente = ",

assim, onde estiver;

100200300, 100200301, 10200302


teremos;

10200300 or idCliente = 100200301 or idCliente = 100200302


Em seguida preciso deste resultado em uma variavel, para que eu possa usa-la na consulta seguinte, assim;

select * from tbClientes where idCliente = @resultado



Estou tentando fazer algo assim, mas esta dando que a coluna nao existe;

SELECT REPLACE(tbClientes.Dependentes, ',', ' or tbClientes.idCliente = ') as Dep,
@dt:= Dep,
(select idCliente from tbClientes where idCliente=@dt)
from tbClientes where tbClientes.idCliente = @dt


Tudo isso na mesma consulta, o que eu quero, é encontrar o cliente principal e selecionar todos os clientes em que existirem na coluna DEPENDENTES dele.

Aguardo,

Forte abraço
Fernando Alves

Fernando Alves

Responder

Post mais votado

02/03/2016

Fernando,

Consegui resolver assim no Sql Server...

declare @Sql varchar(500)
declare @Condicao varchar(200)
set  @Condicao = (select replace(Dependentes,',',''',''') from tbClientes where idCliente = 100207907)
set @Sql = 'select * from tbClientes where idCliente in ('+''''+@Condicao+''')'
exec(@Sql)


Realmente, o SqlFiddle está com problemas....

Quando normalizar, tento adaptar para o MySql.

Marcos P

Marcos P
Responder

Mais Posts

02/03/2016

Marcos P

Fernando,

A ideia é selecionar o cliente e todos seus dependentes na mesma query, certo ?

Isso para um cliente específico ou para todos os clientes ?

Como cada cliente pode ter uma composição diferente de dependentes, ou seja, diferentes ocorrências separadas por vírgulas, resolver isso aí não parece ser são trivial assim...

Em um primeiro momento, recomendaria um cursor que a partir dos clientes principais, trata-se, caso-a-caso a separação dos dependentes e posterior seleção.
Responder

02/03/2016

Fernando Alves

Então Marcos nesse caso, eu teria que realizar consultas a parte ?

É de um cliente específico sim,

Por exemplo trazer numa consulta e tratar atraves do PHP a separação dos IDs que fazem parte dos DEPENDENTES

e outra consulta que obteve numa variavel os dependentes e utilizar como condição da consulta.

Eu ja tinha imaginado isso, mas pensei em fazer algo mais profissional que não comprometesse o desempenho, mas como vc mesmo falou, neste caso é muito dificil realizar uma consulta perfeita com essas condições da minha tabela.

Se vc tiver mais uma ideia, eu agradeço,

Obrigado Marcos.
Responder

02/03/2016

Marcos P

Gostei do "mais profissional" !

Faz assim, vai no SqlFiddle.

Cria a estrutura da tabela, popula ela com alguns registros de teste, coloca a query que você tentou e volta aqui com o link.

A partir disso, conseguimos tentar chegar em algo mais próximo do que você precisa.
Responder

02/03/2016

Marcos P

Outra opção é você procurar, aqui mesmo no fórum, sobre "query dinâmica"...
Responder

02/03/2016

Fernando Alves

kkk...

Eu ja disse uma outra vez aqui, é que minha aplicação ainda tem aquelas consultas desnecessárias tipo,
Select * from 
sendo que eu precisaria somente de dois ou tres campos desta tabela. Eu estou tratando todas estas consultas antigas, pq tem mais gente usando o sistema, e estou tendo algumas reclamações com lentidão e erros no sistema, apesar que meu plano na Locaweb é Hospedagem I, não posso nem reclamar.. hehe, mas é importante um banco bem desenhado.

Enfim... combinado vou montar lah e ja volto aqui.

Vlw Marcos.
Responder

02/03/2016

Fernando Alves

Marcos, acho que o SQLfiddle nao esta funcionando direito, estou te passando a estrutura ja com os dados que vc me pediu;


CREATE TABLE tbClientes
	(`idCliente` int, `Nome_razao` varchar(200), `Endereco` varchar(55), `Dependentes` varchar(255))
;
	
INSERT INTO tbClientes
   (`idCliente`, `Nome_razao`, `Endereco`, `Dependentes`)
VALUES
   (100207907, 'ANTONIO', 'AVENIDA RUBENS CARAMEZ', '100206649,100206421');
   
INSERT INTO tbClientes
   (`idCliente`, `Nome_razao`, `Endereco`, `Dependentes`)
VALUES
   (100206649, 'JOSE', 'AVENIDA LIBERDADE', '');   
   
  INSERT INTO tbClientes
   (`idCliente`, `Nome_razao`, `Endereco`, `Dependentes`)
VALUES
   (100206421, 'MARIA', 'AVEN. SANTO ANDRE', '');    


Agora vai a situação, destes três registros que foram inclusos na tbClientes;

O usuário só tem em mãos inicialmente o ID de apenas 1 cliente, que nesta tabela se refere ao ANTONIO (100207907).

Então eu preciso que através deste ID ele me lista em uma consulta os três registros, os dois por base na coluna DEPENDENTES e o próprio cliente responsavel.


Eu fiz assim atraves da minha logica;

SELECT REPLACE(tbClientes.Dependentes, ',', ' or tbClientes.idCliente = ') as Dep,
@dt:= Dep,
(select idCliente from tbClientes where idCliente=@dt)
from tbClientes where tbClientes.idCliente = @dt


Mas esta dando erro FIELD, creio que ele nao esta associando o campo. Mas a ideia deste código primeiro era trocar a virgula dos IDs do campo DEPENDENTES pela string
or tbClientes.idCliente =
dai usaria este resultado para executar um subquery, trazendo assim os clientes que estão armazenados na coluna DEPENDENTES do registro do cliente ANTONIO.

Aguardo se puder me ajudar.
Responder

02/03/2016

Fernando Alves

Eu só usaria query dinamica se realmente nao encontrasse uma solução em MySQL
Responder

02/03/2016

Marcos P

Teu script de carga nas tabelas está errado !

Você está criando 4 colunas e populando apenas 3.

Revise isso e volte, por aqui...
Responder

02/03/2016

Marcos P

Isso aí embaixo, não resolve teu problema ?

select * from tbClientes where idCliente IN (select Dependentes from tbClientes where idCliente=100207907);

ou...

SELECT @dt  := (select Dependentes from tbClientes where idCliente = 100207907);
select * from tbClientes where idCliente in (@dt);
Responder

02/03/2016

Fernando Alves

Nossa... desculpe pelo meu erro primario, e obrigado por não me abandonar nessa Marcos,

Então esta ultima postagem sua não deu certo, ele até busca pelo ID do responsável, mas retorna apenas uma linha com um dos clientes da coluna dependentes.

Agora essa com variaveis em SQL Server esta perfeita ao meu ver, pois eu tentei aplicar isso em MySQL como te mostrei anteriormente e estava dando aquele erro de FIELD.

Quando então estabilizar o SqlFiddle nós fazemos juntos.

vlw.



Uma pergunta:

Este SqlFiddle ou outra ferramenta consegue traduzir um codigo de um banco de dados para outro ?
Responder

02/03/2016

Marcos P

No MySql fica...

SET @a = (select Dependentes from tbClientes where idCliente = 100207907);
SET @t1 = CONCAT("select * from tbClientes where idCliente in (",@a,")");
PREPARE sqlCMD FROM @t1;
EXECUTE sqlCMD;

Desconheço essa funcionalidade de conversão no SqlFiddle ou em alguma outra ferramenta.

Mas, quem sabe, uma pesquisa na rede possa encontrar algo que faça isso...
Responder

03/03/2016

Fernando Alves

Perfeito!

Muito bom, era exatamente isso que eu precisava,

Muito obrigado Marcos, obrigado mesmo,

Finalizo este topico com mais uma questão solucionada, e fica para todos os membros do grupo a dica quem precisar.

Forte abraço Marcos, agente se fala.
Responder

08/07/2022

Sinval Felisberto

Muito bom!
Usei sua solução para conseguir prosseguir aqui em casa com os estudos em MySQL.
Valeu mesmo!
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar