Jump to content
gust.php

Produtos, categorias e subcategorias.

Recommended Posts

Prezados, boa noite.

 

Nunca fiz isso e estou dúvidas.

 

Tenho as tabelas CATEGORIAS e SUBCATEGORIAS. Os cadastros e relacionamentos estão funcionando perfeitamente, tudo ok aqui.

Tenho também a tabela PRODUTOS.

 

Digamos que eu tenha produtos que fazem parte de categorias que não tem subcategoria, e tenho produtos que fazem parte de subcategorias de alguma categoria.

 

Como fazer o relacionamento desses produtos?

 

Vou relacionar a tabela PRODUTOS com CATEGORIAS e SUBCATEGORIAS ?

A dúvida surgiu pois um produto pode fazer parte de uma categoria que não tem subcategoria, mas posso ter também produtos que fazem parte de subcategorias de uma categoria.

E qual a cardinalidade desse relacionamento?

 

Ja vi gente fazendo o relacionamento só com SUBCATEGORIA, mas e se não existir subcategoria????

 

produto many to many categoria

produto many to many subcategoria

 

produto

id | produto 

 

prod_cat

cat_id | prod_id

 

categoria

id | categoria 

 

subcategoria

id | categoria 

 

prod_subcat

subcat_id | prod_id

 

Como resolver isso de um forma correta?

Share this post


Link to post
Share on other sites

Vamos lá!

 

Primeiramente, fiz um exemplo meio

que chatinho, a query é bem grande,

porém não deixa de ser funcional...

 

Sem mais de longas, vamos a ela!

 

 

TABELAS+DADOS A SER UTILIZADAS(OS)

CREATE DATABASE db_01;
USE db_01;

CREATE TABLE categoria (
	id INT NOT NULL AUTO_INCREMENT,
	categoria VARCHAR(60) NOT NULL,
	PRIMARY KEY(id)
);
INSERT INTO categoria (categoria) VALUES
('Televisor'),
('Notebook'),
('Adaptador');

CREATE TABLE produto (
	id INT NOT NULL AUTO_INCREMENT,
	produto VARCHAR(60) NOT NULL,
	PRIMARY KEY(id)
);
INSERT INTO produto (produto) VALUES
('Televisor Samsung'),
('Notebook Samsung'),
('Televisor LG'),
('Adaptador HMDI'),
('Televisor Gnusmas'),
('Notebook Acer'),
('Adaptador Universal');

CREATE TABLE prod_cat (
	id INT NOT NULL AUTO_INCREMENT,
	cat_id INT NOT NULL,
	prod_id INT NOT NULL,
	PRIMARY KEY (id),
	FOREIGN KEY (cat_id) REFERENCES categoria (id),
	FOREIGN KEY (prod_id) REFERENCES produto (id)
);
INSERT INTO prod_cat (cat_id, prod_id) VALUES
(3, 4),
(3, 7);

CREATE TABLE subcategoria (
	id INT NOT NULL AUTO_INCREMENT,
	cat_id INT NOT NULL,
	categoria VARCHAR(60) NOT NULL,
	PRIMARY KEY(id),
	FOREIGN KEY (cat_id) REFERENCES categoria (id)
);
INSERT INTO subcategoria (cat_id, categoria) VALUES
(1, 'LG'),
(2, 'Samsung'),
(1, 'Samsung'),
(1, 'Gnusmas'),
(2, 'Acer');

CREATE TABLE prod_subcat (
	id INT NOT NULL AUTO_INCREMENT,
	subcat_id INT NOT NULL,
	prod_id INT NOT NULL,
	PRIMARY KEY(id),
	FOREIGN KEY (subcat_id) REFERENCES subcategoria (id)
);
INSERT INTO prod_subcat (subcat_id, prod_id) VALUE
(1, 3),
(3, 1),
(2, 2),
(4, 5),
(5, 6);

 

RELACIONAMENTO DAS TABELAS

image.png.5f12f26646a9caa0a4e54c1d984eeec3.png

 

QUERY

SELECT
	p.id AS 'idProduto',
	cp.cat_id AS 'idCategoria',
	ps.subcat_id AS 'idSubCategoria',
	p.produto AS 'nomeProduto',
	c.categoria AS 'nomeCategoria',
	sc.categoria AS 'nomeSubCategoria'
FROM
	produto p
LEFT JOIN
	prod_cat cp
ON
	( p.id = cp.prod_id )
LEFT JOIN
	prod_subcat ps
ON
	( p.id = ps.prod_id )
LEFT JOIN
	subcategoria sc
ON
	( ps.subcat_id = sc.id )
LEFT JOIN
	categoria c
ON
	c.id = CASE
		WHEN
			cp.cat_id IS NULL
		THEN
			sc.cat_id
		ELSE
			cp.cat_id
	END
ORDER BY
	p.id
;

 

RESULTADO

image.png.f360481e530ba4ec361ef28b9f13900b.png

 

EXPLICAÇÃO

Basicamente o'que fizemos foi obter

todos os produtos, onde "verificamos"

através do LEFT JOIN se o mesmo

está ou não nas tabelas onde contém

os relacionamentos...

 

Caso não exista em uma tabela, então

atravéz do LEFT JOIN o mesmo será

dado como NULL...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By brunoogm
      Pessoal, vou iniciar um desenvolvimento mobile usando Xamarin
      e gostaria de saber se alguém conhece alguma maneira
      ou tenha algum doc. de como utilizar PHP e MySql (e se necessário Json)
      para realizar um CRUD e a partir daí eu poder me entender com a plataforma...
       
      Desde já obrigado.
       
       
    • By drx
      Olá pessoal!
       
      Me tirem uma dúvida. Já desenvolvo com vb6 já faz algum tempo. E também venho incrementando o conhecimento para desenvolver para web com php e por aí vai.
      A pergunta que não quer calar: Com o VS.NET eu desenvolvo para desktop e web ?
      Por que a pergunta? Porque quero investir tempo em um IDE que me atenda as duas coisas.
      Aguardo
    • By drx
      Olá feras!
       
      Estou recebendo este retorno da conexão: SQLSTATE[HY000] [1049] Base 'dbbase' inconnue
       
      O que é que pode ser?
       
      Tudo certinho. Fala que a dbbase não existe, mas existe.
      Alguém tem uma solução ?
       
      Desde já agradeço.
    • By fabioamorais
      Ola pessoal, sou novo aqui no fórum e também no mundo da programação. 

      Estou criando um sistema de cadastro de clientes em PHP 7 e mysql
      para meu serviço para fins de organização, tenho ja pronto o sistema de cadastro e edição do cliente, tenho login por usuário e senha.
      preciso colocar nesse sistema uma forma que registre a ação e o usuário que fez a ação quando houver uma alteração no cadastro.
      exemplo;
      O usuario (jose) alterou o status de analise para concluído .
      o usuario (pedro) alterou a localização de mesa para armario.
      e que fosse exibido como um tipo de histórico de eventos no próprio cadastro do cliente.
      e nesse campo se ainda tiver como add cometários.
      Usuario (jose): Precisa entrar em contato com o cliente francisco. 
      Usuario (pedro): cliente foi avisado e está sabendo.
       
      quem souber uma forma de fazer isso, ficaria muito grato.

    • By proflupin
      Estou com a seguinte dificuldade, possuo um <a> que busca uma id numa tabela do banco de dados, conforme abaixo:
       
      <a href="self_service.php?id=<?php echo $row_produto['id_categoria_chamado']?>" class="btn btn-primary"data-toggle="collapse" data-target="#subcategoria" aria-expanded="false" aria-controls="collapseExample">Visitar</a> A consulta é realizada, pois vejo que um novo link é mostrado no rodapé da página:

       
      Esta página self_service.php mostrada acima, é minha página principal, onde tudo é trabalhado. Se por exemplo eu mudar para outro arquivo php, teste.php por exemplo, uma nova página é aberta e consigo exibir os resultados normalmente.
       
      O problema é: quero abrir este ID na mesma página, dentro de um collapse. Exemplo:
       
      Cliquei em visitar na categoria Totvs...
       
       
      Um collapse abre-se logo abaixo:

       
      O que não consigo fazer é resgatar o ID passado pelo botão VISITAR em meu collapse, se eu tenter o $_GET['id'], não vai retornar nenhum valor, pois a URL não muda quando trabalhamos com collapse.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.