Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

juliosertori

[Resolvido] Dúvida com Query um pouco Complexa!

Recommended Posts

Bom dia galera, seguinte, tenho uma listagem no meu sistema que é o seguinte.

 

Produto | Categorias | ( Atributos ) - Esses atributos, são de um While de atributos existentes. Ficando assim:

Camiseta | Masculinas | Tamanhos | Cores

 

Até ai tudo bem, nesse caso, vou precisar pegar dados de 4 tabelas. ( Produtos, Categorias, Atributos, Produtos_Atributos, Atributos_Valores )

 

Tabela "produtos".

 

image.thumb.png.2d926e5dfbcfd3c438329479d2a30f1c.png

 

Tabela "categorias".

image.png.e1d28bfa72649b8dd4c10ad1073bd2e9.png

 

Tabela "produtos_atributos".

image.png.24d7bb60cc3b19fe9d7ff0ab49e18d18.png

 

Tabela "atributos".

image.png.efcfba6d915b3867b95c3f2d7eba6d3b.png

 

Tabela "atributos_valores".

image.png.7f6d737dcea331876a3bb46322dbc283.png

 

Notando que na tabela "produtos_atributos" os atributos e valores, são atribuídos pela coluna "atr_valores", sendo por exemplo 1:2, significando que esse produto, tem o atributo tamanho, M, e a quantidade.

 

Poderia fazer vários looping no PHP e pegar os valores sem problema, só que acredito que haja como fazer isso apenas com o MySQL, para ficar mais leve, pois na hora de carregar a listagem vai ficar muitas execuções.

 

Como fazer para pegar então, nome do produto, nomes das categorias, os atributos, os valores de cada atributo, quantidade.

 

Para listar dessa forma:

image.thumb.png.ec782769ecab1141c04499544e33b0d2.png

 

Vai ser de grande ajuda a opinião e sugestão de vocês.

 

Muito obrigado desde já!

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @juliosertori.

 

Acredito que produtos_atributos não deveria ter uma coluna (atr_valores) com valores compostos.

Na minha opinião, você deveria desmembrar esses valores em duas colunas: chave (ou id_atributo) e valor. Depois você cria uma linha para cada atributo de cada produto.

 

No caso, ao invés de uma string com "1:2,6:0", você teria duas linhas:

-> id_atributo: 1 / valor: 2

-> id_atributo: 6 / valor: 0

 

Dessa forma você consegue filtrar, selecionar, buscar, tratar, processar, etc. Tanto na aplicação, quanto no banco.

 

Daí você me pergunta: e a quantidade? Bom, aí mora outro problema. Como você precisa quantificar composições de atributos e não apenas atributos, acredito que esteja faltando uma tabela auxiliar nessa modelagem...

 

Então eu voltaria atrás no que eu disse e sugeriria a seguinte tabela:

produtos_composicoes_atributos( #id, &produto, &id_atributo, &id_valor_atributo, cod_barras )

Obs: você não precisa de &empresa, pois &produto já está associado a uma empresa (na tabela produtos).

 

E aí a nossa atual produtos_atributos eu alteraria para ficar dessa forma:

produtos_estoque( #id, &composicao, quantidade, ... )

Obs: Note que não coloquei &produto ou &empresa, pois &composicao já possui essas informações.

 

Enfim, espero ter ajudado... :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi sim amigo sua ideia e agradeço muito, o maior problema é que o sistema já está praticamente todo formulado dessa forma, e mudar a estrutura do banco significaria uma mudança geral no cadastro de produtos, atributos, quantidades, vendas, etc.

 

Da forma que está, existe alguma possibilidade de efetuar uma Query que consiga capturar os dados que disse anteriormente?

 

Desde já agradeço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom.. SQL é quase uma linguagem de programação.

Você pode usar IF, CASE, REPEAT, SUBSTR, LOCATE, SUBSTRING_INDEX (e outras funções/operadores para manipular a consulta e strings) e ainda pode aliar isso com FUNCTIONS ou STORED PROCEDURES.

 

Você ainda poderia criar consultas com LIKE '%$id_atributo:$id_valor_atributo%' para buscar por produtos com determinados atributos.

 

A questão é: compensa? E não digo apenas o tempo para construir essas gambiarras, mas também o custo na performance da aplicação. =/

Eu não pensaria duas vezes em refazer esse trecho. Você só tem a ganhar.

 

De qualquer forma, sugiro que dê uma olhada no manual para ver se alguma função lhe ajuda:

https://dev.mysql.com/doc/refman/8.0/en/string-functions.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, me diz uma coisa, na experiência de vocês, o que ficaria com melhor desempenho?

 

Fazer uma busca utilizando apenas o SQL, mesmo de forma complexa, ou utilizar o PHP para pegar separadamente e "unir" no Front?

Compartilhar este post


Link para o post
Compartilhar em outros sites
10 horas atrás, juliosertori disse:

o que ficaria com melhor desempenho?

Depende inteiramente de como você criou a solução e e especificamente o que você está processando no banco.

Eu particularmente sempre evito usar o banco como "gestor de mecânicas da aplicação". Gatilhos/Triggers por exemplo, sempre dou preferência para fazer na aplicação e não no banco.

 

Além disso, não sei qual a linguagem de programação você adotou, mas eu particularmente acho muito mais fácil otimizar código do que consultas complexas. Você pode utilizar profilers / testes de carga, gerar logs, cachear informações, tudo a seu controle.

E no final ainda pode/deve escalar (tornando a performance mais uma variável de custo do que de tempo de carregamento).

 

Infelizmente só medindo na prática você conseguiria saber qual solução é mais eficiente, então eu sugiro que trilhe o caminho que lhe seja mais confortável de manter depois.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema de campos multivalirados  como o atr_valores é que complicam queries que deveriam ser banais.

 

Vou na linha diferente do Matheus , prefiro sempre as soluções de BD , nem sempre são as melhores , caso de Sistema multi-plataforma por exemplo.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado por compartilhar informações e conhecimento de vocês. Me sinto mais confortável fazer direto na aplicação e vou seguir esse caminho então.

 

Grande abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Fala pessoal.
       
      Seguinte:
       
      Quero selecionar duas tabelas e mostrar com resultados intercalados. Abaixo segue um código explicando para vcs terem uma ideia.
       
      $consulta = "SELECT A.*, B.* FROM tabela1 A, tabela2 B'";
      $resultado = mysqli_query($conexao, $consulta) or die ("erro");
      while($busca = mysqli_fetch_array($resultado)){
       
      print $busca['cod_evento']; --> traz o código da tabela1 
      print $busca['titulo_evento']; -->  traz o titulo da tabela1
      print $busca['cod_noticia']; --> traz o código da tabela2
      print $busca['titulo_noticia']; --> traz o tituloda tabela2
       
      }
       
      Espero que entendam. Grato
       
    • Por gersonab
      Bom dia
      estou com uma dúvida de como proceder, tenho uma tabela de categoria e uma de subcategoria, a categoria pode ter várias subs, até ai tranquilo, quando faço update de uma sub altero normalmente a quantidade deste, até aí normal, porém me deparei com uma situação um pouco diferente, vou tentar ser o mais claro possível, de certa forma algumas subs são comuns só mudando o nome praticamente, aí eu preciso que ao efetuar o update em umas destas este ocorra nas demais, tipo:
       
      Se o id da sub for 5 , eu preciso fazer o mesmo update nos ids 6 e 7 ;
       
      Se o id da sub for 9 , eu preciso fazer o mesmo update no id 10
       
      se for 2 , fazer o update somente neste
       
      ainda não estou conseguindo ver uma lógica para isso, e ou uma nova coluna para cadastrar em comum nestes casos.
       
      qual seria a melhor opção
    • Por ILR master
      Boa tarde, pessoal.
      Espero que todos estejam bem.
       
      Seguinte:
      Tenho a seguinte consulta:
       
      $usuarios= "SELECT * FROM usuarios";
      $query= mysqli_query($conexao, $usuarios) or die ("Usuário não encontrado");
      $usuario = mysqli_fetch_array($query);
       
      Quero pegar apenas o campo 'nome' da tabela 'usuarios' e colocar todos os resultados da seguinte forma:
       
      $nomes = array("Rafael", "João", "Maria", "Pedro", "Patricia", "Camila");
       
      Agradeço desde já.
      Abs
       
       
    • Por JoaoSilva75
      oi pessoal
       
      se eu entrar no link dos desenvolvedores php pesquisasar quem é programador e enviar uma mesma mensagem para uns 6 ou 8 membros do forum serei advertido   ou é spam ???????
       
      procuro um programador php para me fazer algo 
       
      mas não tem como postar aqui nessa sessão
       
    • Por clovis.sardinha
      Tenho uma consulta de autocomplete no bd que funciona no servidor local e não roda no servidor da web. 
      Ao enviar a consulta no servidor local  aparece no console :Fetch terminou o carregamento: GET ".../Cidade?cidade=sao%20paulo". A pesquisa é feita normalmente.
      Quando mando a mesma pesquisa para o servidor web(locaweb) aparece no console: Fetch terminou o carregamento: GET "..../Cidade?cidade=sao%2520paul".
      O número 25 aparece só no servidor web. Pelo que pesquisei 25 significa %, ou seja, está duplicando o caractere %. 
      Não consegui utilizar nenhuma função para evitar que isto ocorra. Alguém sabe se há alguma configuração no servidor web que possa ser alterada para evitar essa duplicação?
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.