未能找到 this 的解决方案我想知道是否有更好的方法来存储这个问题的数据。
该数据库结构允许项目存储在多个类别中,但不允许轻松访问父类别层次结构。
我想要的是有一个类别关系,例如:
Books
> Novels
> Paperbacks
> Hardbacks
例如,将一个项目存储在平装本中,该项目也会出现在小说和书籍中。因此,“类别”实际上更像是过滤器,而不是实际的类别。
最佳答案
首先,您需要使用 Nested Set 来设计类别表。建筑学。通过使用嵌套集,您可以轻松选择整个类别分支,然后您将能够为这些类别选择产品。
所以第一个表将是:
CREATE TABLE categories (
id int unsigned NOT NULL auto_increment,
name varchar(255) NOT NULL,
left int unsigned NOT NULL,
right int unsigned NOT NULL,
PRIMARY KEY (id)
);
第二个表将是:
CREATE TABLE products (
id int unsigned NOT NULL auto_increment,
name varchar(255) NOT NULL,
PRIMARY KEY (id)
);
第三个表将是:
CREATE TABLE product_categories (
category_id int unsigned NOT NULL,
product_id int unsigned NOT NULL,
PRIMARY KEY (category_id, product_id)
);
现在要选择整个类别分支的所有产品,您需要使用如下查询:
SELECT p.*
FROM categories AS c1
LEFT JOIN categories AS c2 ON c1.left <= c2.left AND c2.right <= c1.right
LEFT JOIN product_categories AS pc ON pc.category_id = c2.id
LEFT JOIN products AS p ON pc.product_id = p.id
WHERE c1.id = @id
嵌套集合运算
添加新节点
第一步:更新已有的类别
UPDATE categories
SET right = right + 2, left = IF(left > @right, left + 2, left)
WHERE right >= @right
第二步:插入新类别
INSERT INTO categories SET left = @right, right = @right + 1, name = @name
删除现有节点
第一步:删除节点
DELETE FROM categories WHERE left >= @left AND right <= @right
第二步:更新其他节点
UPDATE categories
SET left = IF(left > @left, left – (@right - @left + 1), left),
right = right – (@right - @left + 1)
WHERE right > @right
关于php - 用于从父类别检索子类别中存储的项目的数据库架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8441723/