1

分类数据库

id name    parent_id  slug
----------------------------------
1  Men     0          men
2  Shoes   1          shoes
3  Sports  2          sports
4  Women   0          women
5  Shoes   4          shoes
6  Sports  5          sports

假设我在domain/category/men/shoes/sports

$last_slug = end((explode('/', Request::url()))); 

在这里我可以得到sports最后一个查询

问题 :

如何动态检索所有父母蛞蝓,所以如果蛞蝓我可以选择这样的东西depth = 3

SELECT t1.name AS level_one,
       t2.name AS level_two,
       t3.name AS level_three,
       t3.id   AS requested_id
FROM   categories AS t1
       LEFT JOIN categories AS t2 ON t2.parent_id = t1.id
       LEFT JOIN categories AS t3 ON t3.parent_id = t2.id
WHERE  t1.slug = 'men'
       AND t2.slug = 'shoes'
       AND t3.slug = 'sports'
LIMIT  1 
4

2 回答 2

2

最好的方法是有一个额外的列来存储完整的路径。

这是在 db - Materialized Path 中存储树的标准方法之一。

作为奖励,您将能够通过单个查询选择当前类别的所有子项。

当 slug 更改或子类别从一个父级移动到另一个父级时,正确更新路径变得更加棘手。但这是不会经常执行的操作。

使用连接动态构建查询不利于性能,尤其是对于这样一个简单的任务:按路径选择类别。

于 2013-07-12T15:03:28.783 回答
0

只需轻轻交换连接的顺序:-

SELECT t1.name AS level_one,
       t2.name AS level_two,
       t3.name AS level_three,
       t1.id   AS requested_id
FROM   categories AS t1
       LEFT JOIN categories AS t2 ON t2.id = t1.parent_id
       LEFT JOIN categories AS t3 ON t3.id = t2.parent_id
WHERE  t1.slug = 'sports'
于 2013-07-12T14:54:50.250 回答