I would like to create a procedure that recursively went through a table and built a string for every row. Each row is related to another row except for a few that are at the top of the hierarchy.
Here is what I have:
CREATE TABLE item (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(30) NOT NULL,
category INT NULL,
PRIMARY KEY (id),
FOREIGN KEY (category)
REFERENCES item(id)
);
CREATE PROCEDURE get_item()
SELECT *
FROM item;
-- main categories --
INSERT INTO item (name, category) VALUES
('groceries', NULL),
('retail', NULL),
('service', NULL),
('grains', 1),
('produce', 1),
('meats', 1),
('dairy', 1),
('snacks', 1),
('beverages', 1),
('car', 2),
('home', 2),
('clothing', 2),
('electronics', 2),
('chips', 8),
('dip', 8),
('snack bars', 8),
('haircut', 3);
When get_item()
is called it should give this table:
| id | name | category |
|----|--------------|-----------|
| 1 | groceries | NULL |
| 2 | retail | NULL |
| 3 | service | NULL |
| 4 | grains | 1 |
| 5 | produce | 1 |
| 6 | meats | 1 |
| 7 | dairy | 1 |
| 8 | snacks | 1 |
| 9 | beverages | 1 |
| 10 | car | 2 |
| 11 | home | 2 |
| 12 | clothing | 2 |
| 13 | electronics | 2 |
| 14 | chips | 8 |
| 15 | dip | 8 |
| 16 | snack bars | 8 |
| 17 | haircut | 3 |
I would like it to look like this:
| id | name | category | path |
|----|--------------|-----------|-----------------------------------|
| 1 | groceries | NULL | groceries |
| 2 | retail | NULL | retail |
| 3 | service | NULL | service |
| 4 | grains | 1 | groceries > grains |
| 5 | produce | 1 | groceries > produce |
| 6 | meats | 1 | groceries > meats |
| 7 | dairy | 1 | groceries > dairy |
| 8 | snacks | 1 | groceries > snacks |
| 9 | beverages | 1 | groceries > beverages |
| 10 | car | 2 | retail > car |
| 11 | home | 2 | retail > home |
| 12 | clothing | 2 | retail > clothing |
| 13 | electronics | 2 | retail > electronics |
| 14 | chips | 8 | groceries > snacks > chips |
| 15 | dip | 8 | groceries > snacks > dip |
| 16 | snack bars | 8 | groceries > snacks > snack bars |
| 17 | haircut | 3 | service > haircut |
I don't know how I would go about doing this.