Guardar resultado da consulta em variavel, tratá-la com replace, e usa-la como condição em outra consulta em MySQL
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;
teremos;
Em seguida preciso deste resultado em uma variavel, para que eu possa usa-la na consulta seguinte, assim;
Estou tentando fazer algo assim, mas esta dando que a coluna nao existe;
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
É 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
Curtidas 0
Melhor post
Marcos P
02/03/2016
Fernando,
Consegui resolver assim no Sql Server...
Realmente, o SqlFiddle está com problemas....
Quando normalizar, tento adaptar para o MySql.
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.
GOSTEI 2
Mais Respostas
Marcos P
02/03/2016
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.
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.
GOSTEI 0
Fernando Alves
02/03/2016
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.
É 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.
GOSTEI 0
Marcos P
02/03/2016
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.
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.
GOSTEI 0
Marcos P
02/03/2016
Outra opção é você procurar, aqui mesmo no fórum, sobre "query dinâmica"...
GOSTEI 0
Fernando Alves
02/03/2016
kkk...
Eu ja disse uma outra vez aqui, é que minha aplicação ainda tem aquelas consultas desnecessárias tipo, 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.
Eu ja disse uma outra vez aqui, é que minha aplicação ainda tem aquelas consultas desnecessárias tipo,
Select * from
Enfim... combinado vou montar lah e ja volto aqui.
Vlw Marcos.
GOSTEI 0
Fernando Alves
02/03/2016
Marcos, acho que o SQLfiddle nao esta funcionando direito, estou te passando a estrutura ja com os dados que vc me pediu;
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;
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 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.
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 =
Aguardo se puder me ajudar.
GOSTEI 0
Fernando Alves
02/03/2016
Eu só usaria query dinamica se realmente nao encontrasse uma solução em MySQL
GOSTEI 0
Marcos P
02/03/2016
Teu script de carga nas tabelas está errado !
Você está criando 4 colunas e populando apenas 3.
Revise isso e volte, por aqui...
Você está criando 4 colunas e populando apenas 3.
Revise isso e volte, por aqui...
GOSTEI 0
Marcos P
02/03/2016
Isso aí embaixo, não resolve teu problema ?
ou...
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);
GOSTEI 0
Fernando Alves
02/03/2016
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 ?
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 ?
GOSTEI 0
Marcos P
02/03/2016
No MySql fica...
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...
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...
GOSTEI 1
Fernando Alves
02/03/2016
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.
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.
GOSTEI 0
Sinval Felisberto
02/03/2016
Muito bom!
Usei sua solução para conseguir prosseguir aqui em casa com os estudos em MySQL.
Valeu mesmo!
Usei sua solução para conseguir prosseguir aqui em casa com os estudos em MySQL.
Valeu mesmo!
GOSTEI 0