Mysql递归连接

时间:2011-04-07 09:34:42

标签: mysql mysqli

我有一个表“类别”和一个表“产品”。类别 4深度级别

表类别有一个引用同一个表的外键category_fk,以及一个带有modrewrite URL部分的字段。该字段名为mr

产品具有引用表类别

的外键category_fk

只有最后一个级别的类别才有产品,但最后一个类别的深度并不总是4.类别可能只有2个或3个级别。

我的问题是:是否可以执行一个返回所有连接mr字段的查询,例如此cat1/cat2/cat3,或者所有结构都没有写入所有左连接和表类别的别名,如“as c1 “,”作为c2“?

2 个答案:

答案 0 :(得分:0)

使用您描述的表结构是不可能的,但如果您采用嵌套集模型,则可能。文章Managing Hierarchical Data in MySQL描述了它(与其他模型一样)。

答案 1 :(得分:0)

基于这种结构

create table category (id int, mr varchar(10), category_fk int);
create table products (id int, name varchar(100), category_fk int);

insert category values
(1, 'cat1', null),(2, 'cat2', 1),(3, 'cat3', 2),(4, 'cat4', 3),
(5, 'cat5', null),(6, 'cat6', null),(7, 'cat7', 5);

insert products values
(1, 'product A', 4),
(2, 'product B', 3),
(3, 'product C', 5),
(4, 'product D', 7),
(5, 'product E', 7),
(6, 'product F', 1);

查询

select p.name, substr(concat(
  ifnull(concat('/',c4.mr),''),
  ifnull(concat('/',c3.mr),''),
  ifnull(concat('/',c2.mr),''),
  ifnull(concat('/',c1.mr),'')),2)
from products p
left join category c1 on p.category_fk = c1.id
left join category c2 on c1.category_fk = c2.id
left join category c3 on c2.category_fk = c3.id
left join category c4 on c3.category_fk = c4.id

注释

  • substr剥离第一个/
  • concat与联接(父亲优先)
  • 的顺序相反
  • concat'/'和null返回null,后面改为'',否则会使主concat为空