MySQL
쇼핑몰과 카테고리 2단계
H_u
2024. 6. 24. 10:18
728x90
반응형
SMALL
1. 설계
tb_categories 테이블
Field Name | Data Type | Description | Constraints | Example Values |
category_id | INT | 카테고리의 고유 ID | PRIMARY KEY, AUTO_INCREMENT | 1, 2, 3 |
parent_id | INT | 상위 카테고리의 ID | FOREIGN KEY, NULL 가능 | NULL, 1 |
category_name | VARCHAR(100) | 카테고리 이름 | NOT NULL | "남성복", "팬츠", "셔츠" |
category_id | parent_id | category_name |
1 | NULL | 남성복 |
2 | NULL | 여성복 |
3 | 1 | 팬츠 (남성복) |
4 | 2 | 셔츠 (남성복) |
5 | 1 | 팬츠 (여성복) |
6 | 2 | 셔츠 (여성복) |
7 | 3 | 면바지 (남성복) |
8 | 5 | 면바지 (여성복) |
9 | 3 | 슬랙스 (남성복) |
10 | 5 | 슬랙스 (여성복) |
CREATE DATABASE demo3;
USE demo3;
-- 카테고리 테이블 (상위, 하위 개념 추가)
CREATE TABLE tb_categories(
category_id INT AUTO_INCREMENT PRIMARY KEY,
parent_id INT NULL,
category_name VARCHAR(100),
FOREIGN KEY(parent_id) REFERENCES tb_categories(category_id)
);
desc tb_categories;
insert into tb_categories(category_name) values('남성복');
insert into tb_categories(category_name) values('여성복');
select * from tb_categories;
-- 남성복의 하위 카테고리
insert into tb_categories(parent_id, category_name)
values(1, '팬츠');
insert into tb_categories(parent_id, category_name)
values(1, '셔츠');
-- 여성복의 하위 카테고리
insert into tb_categories(parent_id, category_name)
values(2, '팬츠');
insert into tb_categories(parent_id, category_name)
values(2, '셔츠');
-- 남성복 팬츠의 하위 카테고리
insert into tb_categories(parent_id, category_name)
values(3, '면바지');
insert into tb_categories(parent_id, category_name)
values(3, '슬랙스');
-- 여성복 팬츠의 하위 카테고리
insert into tb_categories(parent_id, category_name)
values(5, '면바지');
insert into tb_categories(parent_id, category_name)
values(5, '슬랙스');
tb_products 테이블
Field Name | Data Type | Description | Constraints | Example Values |
product_id | INT | 상품의 고유 ID | PRIMARY KEY, AUTO_INCREMENT | 1, 2, 3 |
product_name | VARCHAR(100) | 상품 이름 | - | 남성셔츠 ... |
category_id | INT | 카테고리 ID | FOREIGN KEY, NULL 가능 | |
price | DECIMAL(10,2) | 상품 가격 | - | |
size | VARCHAR(10) | 상품 사이즈 | - | S, M, L, XL |
color | VARCHAR(50) | 상품 컬러 | - | 퍼플, 핑크, 샤인 |
product_id | product_name | category_id | price | size | color |
1 | 남성 셔츠 | 4 | 49900 | L | 퍼플 |
2 | 남성 면바지 | 7 | 54900 | M | 핑크 |
3 | 남성 슬랙스 | 8 | 104900 | XL | 샤인 |
4 | 여성 셔츠 | 6 | 49900 | L | 퍼플 |
5 | 여성 면바지 | 9 | 54900 | M | 핑크 |
6 | 여성 슬랙스 | 10 | 104900 | XL | 샤인 |
CREATE TABLE tb_products(
product_id INT AUTO_INCREMENT PRIMARY KEY,
product_name VARCHAR(255),
category_id INT,
price DECIMAL(10, 2),
size VARCHAR(10),
color VARCHAR(50),
FOREIGN KEY(category_id) REFERENCES tb_categories(category_id)
);
-- 남성복 상품 입력
INSERT INTO tb_products(product_name, category_id, price, size, color)
VALUES ('남성셔츠', 4, 49900, 'L', '퍼플'),
('남성면바지', 7, 54900, 'M', '핑크'),
('남성슬랙스', 8, 104900, 'XL', '샤인');
-- 여성복 상품 입력
INSERT INTO tb_products(product_name, category_id, price, size, color)
VALUES ('여성셔츠', 6, 49900, 'L', '퍼플'),
('여성면바지', 9, 54900, 'M', '핑크'),
('여성슬랙스', 10, 104900, 'XL', '샤인');
SELECT * FROM tb_products;
SELECT * FROM tb_categories;
-- 특정 카테고리에 속하는 모든 상품 조회
-- 1단계 (남성, 여성 팬츠에 속하는 상품을 조회)
SELECT p.product_name, p.price, p.size, p.color
FROM tb_products p
JOIN tb_categories c ON p.category_id = c.category_id
WHERE c.category_name = '면바지';
-- 2단계 (만약 여성 면바지만 출력 해야 된다면)
-- 조인 --> 서브쿼리
SELECT p.product_name, p.price, p.size, p.color, c.parent_id
FROM tb_products p
JOIN tb_categories c ON p.category_id = c.category_id
WHERE c.category_name = '면바지' AND c.parent_id = 5;
-- ------------------------------------
SELECT p.product_name, p.price, p.size, p.color, c.parent_id
FROM tb_products p
JOIN tb_categories c ON p.category_id = c.category_id
WHERE c.category_name = '면바지' AND c.parent_id = (
SELECT category_id
FROM tb_categories
WHERE category_name = '팬츠'
AND parent_id = 2
);
-- 문제 1 남성복 셔츠만 출력하시오
SELECT p.product_name, p.price, p.size, p.color, c.parent_id
FROM tb_products p
JOIN tb_categories c ON p.category_id = c.category_id
WHERE c.category_name = '셔츠' AND c.parent_id = (
SELECT category_id
FROM tb_categories
WHERE category_name = '남성복'
);
-- 문제 2 여성복 슬랙스만 출력하시오
SELECT p.product_name, p.price, p.size, p.color, c.parent_id
FROM tb_products p
JOIN tb_categories c ON p.category_id = c.category_id
WHERE c.category_name = '슬랙스' AND c.parent_id = (
SELECT category_id
FROM tb_categories
WHERE category_name = '팬츠'
AND parent_id = 2
);
2. 연습
특정 색상의 상품이 있는 모든 카테고리 조회 (서브쿼리 사용할 필요 없음)
예를 들어, '흰색' 상품이 있는 모든 카테고리를 조회하는 쿼리입니다.
SELECT c.*
FROM tb_products AS p
JOIN tb_categories AS c ON p.category_id = c.category_id
WHERE color = '샤인';
가장 비싼 상품을 가진 카테고리 찾기 (서브쿼리 사용할 필요 없음)
각 카테고리 중 가장 비싼 상품을 가지고 있는 카테고리와 그 상품의 정보를 조회하는 쿼리입니다.
SELECT *
FROM tb_products AS p
JOIN tb_categories AS c ON p.category_id = c.category_id
ORDER BY price DESC
LIMIT 1;
728x90
반응형
SMALL