Join SQL - Codeigniter + SQL Server

05/02/2020

0

Boa tarde!

Tenho uma tabela chamada (alertas), e dentro dessa tabela tenho uma coluna chamada (id_produto).
Na coluna id_produto pode ser guardado no mesmo registro diversos id''''s, que são separados por virgula.

Estou com problemas para poder selecionar o alerta e me trazer junto desses alertas, todos os produtos que contém esses id''''s guardados dentro da coluna id_produto.
A maior questão está sendo esse monte de id guardado na mesma coluna, estou utilizando SQL Server, junto do Codeigniter que é um framework em PHP.

OBS: A coluna id_produto é chave primaria na tabela produtos.
Felipe Butslof

Felipe Butslof

Responder

Posts

05/02/2020

Alec Candia

Oi Felipe,

No mesmo campo ID tu guarda vários índices separados por vírgula?
Amigo, pode ser chato o que vou te dizer, mas acredito que o teu BD não tenha passado por nenhuma forma MRN (Modelo Relacional Normalizado). Se aplicar a 1ª Forma Normal (1FN) ela já impediria a criação de atributos multivalorados, compostos e a combinação entre eles.
Esse projeto já está em produção? O ideal seria rever isso, pois à medida em que a base de dados for crescendo o teu problema vai aumentar.

Abraço
Responder

05/02/2020

Felipe Butslof

Oi Felipe,

No mesmo campo ID tu guarda vários índices separados por vírgula?
Amigo, pode ser chato o que vou te dizer, mas acredito que o teu BD não tenha passado por nenhuma forma MRN (Modelo Relacional Normalizado). Se aplicar a 1ª Forma Normal (1FN) ela já impediria a criação de atributos multivalorados, compostos e a combinação entre eles.
Esse projeto já está em produção? O ideal seria rever isso, pois à medida em que a base de dados for crescendo o teu problema vai aumentar.

Abraço



Boa noite!
É isso mesmo, os índices estão sendo separados por vírgula, infelizmente o projeto está sendo refeito apenas a parte PHP.

O projeto já é bem antigo, e optaram por manter o banco de dados.

Você acha que não tem alguma solução que de para resolver isto ?
Responder

06/02/2020

Kleber Santos

Oi Felipe,

No mesmo campo ID tu guarda vários índices separados por vírgula?
Amigo, pode ser chato o que vou te dizer, mas acredito que o teu BD não tenha passado por nenhuma forma MRN (Modelo Relacional Normalizado). Se aplicar a 1ª Forma Normal (1FN) ela já impediria a criação de atributos multivalorados, compostos e a combinação entre eles.
Esse projeto já está em produção? O ideal seria rever isso, pois à medida em que a base de dados for crescendo o teu problema vai aumentar.

Abraço



Boa noite!
É isso mesmo, os índices estão sendo separados por vírgula, infelizmente o projeto está sendo refeito apenas a parte PHP.

O projeto já é bem antigo, e optaram por manter o banco de dados.

Você acha que não tem alguma solução que de para resolver isto ?


Como foi falado, o correto é normalizar o BD.
Como que é o select que você está usando?
Responder

06/02/2020

Felipe Butslof

Oi Felipe,

No mesmo campo ID tu guarda vários índices separados por vírgula?
Amigo, pode ser chato o que vou te dizer, mas acredito que o teu BD não tenha passado por nenhuma forma MRN (Modelo Relacional Normalizado). Se aplicar a 1ª Forma Normal (1FN) ela já impediria a criação de atributos multivalorados, compostos e a combinação entre eles.
Esse projeto já está em produção? O ideal seria rever isso, pois à medida em que a base de dados for crescendo o teu problema vai aumentar.

Abraço



Boa noite!
É isso mesmo, os índices estão sendo separados por vírgula, infelizmente o projeto está sendo refeito apenas a parte PHP.

O projeto já é bem antigo, e optaram por manter o banco de dados.

Você acha que não tem alguma solução que de para resolver isto ?


Como foi falado, o correto é normalizar o BD.
Como que é o select que você está usando?



$this->db->select('alertas.alerta, alertas.alerta_en, usuarios.usuario, fabricantes.id_fabricante, alertas.ultima_atualizacao, marcas.marca, marcas.id_marca, fabricantes.fabricante, produtos.obs_exclusao, alertas.obs_interna, produtos.produto, alertas.tipo, alertas.data_ini, alertas.data_fim, alertas.ativo, alertas.id_alerta, alertas.id_produto');

Eu precisaria aqui neste join, trazer o nome dos produtos que tem relação com esses índices na coluna.
eu apenas estou conseguindo trazer, se tem apenas um índice na coluna id_produto da tabela alertas.

$this->db->join("produtos", "alertas.id_produto = CONCAT(',' , produtos.id_produto , ',')", "left");


será que realmente não tem nenhuma solução para fazer este join ?


Responder

06/02/2020

Felipe Butslof

Oi Felipe,

No mesmo campo ID tu guarda vários índices separados por vírgula?
Amigo, pode ser chato o que vou te dizer, mas acredito que o teu BD não tenha passado por nenhuma forma MRN (Modelo Relacional Normalizado). Se aplicar a 1ª Forma Normal (1FN) ela já impediria a criação de atributos multivalorados, compostos e a combinação entre eles.
Esse projeto já está em produção? O ideal seria rever isso, pois à medida em que a base de dados for crescendo o teu problema vai aumentar.

Abraço



Boa noite!
É isso mesmo, os índices estão sendo separados por vírgula, infelizmente o projeto está sendo refeito apenas a parte PHP.

O projeto já é bem antigo, e optaram por manter o banco de dados.

Você acha que não tem alguma solução que de para resolver isto ?


Como foi falado, o correto é normalizar o BD.
Como que é o select que você está usando?



$this->db->select(''alertas.alerta, alertas.alerta_en, usuarios.usuario, fabricantes.id_fabricante, alertas.ultima_atualizacao, marcas.marca, marcas.id_marca, fabricantes.fabricante, produtos.obs_exclusao, alertas.obs_interna, produtos.produto, alertas.tipo, alertas.data_ini, alertas.data_fim, alertas.ativo, alertas.id_alerta, alertas.id_produto'');

Eu precisaria aqui neste join, trazer o nome dos produtos que tem relação com esses índices na coluna.
eu apenas estou conseguindo trazer, se tem apenas um índice na coluna id_produto da tabela alertas.

$this->db->join("produtos", "alertas.id_produto = CONCAT('','' , produtos.id_produto , '','')", "left");


será que realmente não tem nenhuma solução para fazer este join ?





Os índices estão sendo armazenados desta maneira na coluna id_produto: ,2,,6,,9,,8,,4,
Responder

06/02/2020

Alec Candia

Oi Felipe,

No mesmo campo ID tu guarda vários índices separados por vírgula?
Amigo, pode ser chato o que vou te dizer, mas acredito que o teu BD não tenha passado por nenhuma forma MRN (Modelo Relacional Normalizado). Se aplicar a 1ª Forma Normal (1FN) ela já impediria a criação de atributos multivalorados, compostos e a combinação entre eles.
Esse projeto já está em produção? O ideal seria rever isso, pois à medida em que a base de dados for crescendo o teu problema vai aumentar.

Abraço



Boa noite!
É isso mesmo, os índices estão sendo separados por vírgula, infelizmente o projeto está sendo refeito apenas a parte PHP.

O projeto já é bem antigo, e optaram por manter o banco de dados.

Você acha que não tem alguma solução que de para resolver isto ?


Pois então, Felipe, a questão crucial é que tu está tentando "contornar" um problema que na verdade precisaria ser "resolvido".
Com o tempo e o aumento de índices no mesmo registro é provável de a situação saia de controle. Eu pensaria em rever isso imediatamente. Colocaria para os solicitantes do projeto essa necessidade de correção explicando desde a degradação de performance em consultas até o problema futuro de manutenção do banco de dados.
Dar ciência do problema que pode se agravar no futuro é também uma responsabilidade da gente, sejamos nós desenvolvedores ou DBA. Mas, enfim, eu não vejo, nesse cenário, uma solução mais acertada que a correção da lógica do teu índice.

Qualquer coisa, estamos junto. Te ajudo no que for possível.

Abraço,

Alec
Responder

07/02/2020

Kleber Santos

Oi Felipe,

No mesmo campo ID tu guarda vários índices separados por vírgula?
Amigo, pode ser chato o que vou te dizer, mas acredito que o teu BD não tenha passado por nenhuma forma MRN (Modelo Relacional Normalizado). Se aplicar a 1ª Forma Normal (1FN) ela já impediria a criação de atributos multivalorados, compostos e a combinação entre eles.
Esse projeto já está em produção? O ideal seria rever isso, pois à medida em que a base de dados for crescendo o teu problema vai aumentar.

Abraço



Boa noite!
É isso mesmo, os índices estão sendo separados por vírgula, infelizmente o projeto está sendo refeito apenas a parte PHP.

O projeto já é bem antigo, e optaram por manter o banco de dados.

Você acha que não tem alguma solução que de para resolver isto ?


Como foi falado, o correto é normalizar o BD.
Como que é o select que você está usando?



$this->db->select('alertas.alerta, alertas.alerta_en, usuarios.usuario, fabricantes.id_fabricante, alertas.ultima_atualizacao, marcas.marca, marcas.id_marca, fabricantes.fabricante, produtos.obs_exclusao, alertas.obs_interna, produtos.produto, alertas.tipo, alertas.data_ini, alertas.data_fim, alertas.ativo, alertas.id_alerta, alertas.id_produto');

Eu precisaria aqui neste join, trazer o nome dos produtos que tem relação com esses índices na coluna.
eu apenas estou conseguindo trazer, se tem apenas um índice na coluna id_produto da tabela alertas.

$this->db->join("produtos", "alertas.id_produto = CONCAT(',' , produtos.id_produto , ',')", "left");


será que realmente não tem nenhuma solução para fazer este join ?




Pelo que entendi você vai ter que tratar o conteúdo do alertas.id_produto na tua aplicação para depois pesquisar.

Uma sugestão:

Busque no BD o alertas.id_produto, que acredito que vai retornar uma String semelhante a essa "1,2,3,4,5,6,7", depois exploda na "," essa string com o PHP, que vai gerar um array de códigos, depois na tua query, você vai ter que fazer um for para poder percorrer esses códigos, mais ou menos assim:
for ($i=0; $i < qtdDeCodigos; $i++) {
$this->db->join("produtos", "alertas.id_produto = arrayDeCodigosExplodido[i]);
}

Provavelmente você vai ter que adaptar essa lógica, mas é para você ter uma ideia da complexidade que você está criando por não ter um BD normalizado
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