我想创建一个递归地遍历表并为每一行构建一个字符串的过程。每一行都与另一行相关,但位于层次结构顶部的少数行除外。
以下是我所拥有的:
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);
什么时候 get_item()
它应该给这个表:
| 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 |
我希望它看起来像这样:
| 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 |
我不知道该怎么做。
1条答案
按热度按时间mxg2im7a1#
为此使用存储过程是一个pita:
结果作为17个不同结果集的一系列返回,每个结果集有一行:
在应用程序代码中调用它时,需要将其作为多结果集语句进行循环。
我很少在mysql中使用存储过程。这在应用程序代码中会简单得多。
我还更喜欢使用其他方法来查询分层数据集,而不是使用递归。幸运的是,在mysql 8.0中,您有递归查询(就像我们在几乎所有其他sql数据库中所做的那样)。您可以在mysql 8.0中执行此操作,而无需使用存储过程: