, . . , , , node, left_node right_node.
, , , .
create table categories (
category_id int primary key auto_increment,
parent_id int,
name varchar(255));
alter table categories
add constraint FK_categories
foreign key (parent_id)
references categories (category_id);
. ( : =))
insert into categories (category_id, parent_id, name)
select 1, null, 'food' union all
select 2, 1, 'fruit' union all
select 3, 2, 'red' union all
select 4, 3, 'cherry' union all
select 5, 2, 'yellow' union all
select 6, 5, 'banana' union all
select 7, 1, 'meat' union all
select 8, 7, 'beef' union all
select 9, 7, 'pork';
parent_id = 1, ..
, , .
select P.name
from categories as C
inner join categories as P
on C.parent_id = P.category_id
where C.name = 'red';
select C.name
from categories as C
inner join categories as P
on C.parent_id = P.category_id
where P.name = 'red';
select C2.name
from categories as C1
inner join categories as C2
on C1.parent_id = C2.parent_id
where C1.name = 'red';
select G.name
from categories C
inner join categories as P
on C.parent_id = P.category_id
inner join categories as G
on P.parent_id = G.category_id
where C.name = 'red';
, .
insert into categories(parent_id, name)
values(2, 'blue');
parent_id 2, categoriy_id .
, red, red.
select
C2.name
from categories C
inner join categories as P
on C.parent_id = P.category_id
inner join categories as P2
on P2.parent_id = P.parent_id and
P2.category_id <> P.category_id
inner join categories as C2
on P2.category_id = C2.parent_id
where C.name = 'red';