在引用表时如何将表连接到自身

问题描述 投票:0回答:2

我有一个表,该表有两列引用其自身。

select * from cgroups;                                                                                                                                          
+----+--------------+-------------+-----------+----------+----------+
| id | title        | description | cunixperm | cgroup_1 | cgroup_2 |
+----+--------------+-------------+-----------+----------+----------+
| 1  | admin        | <null>      | 32        | 1        | <null>   |
| 2  | tag_mng      | <null>      | 32        | 1        | <null>   |
| 3  | tags         | <null>      | 32        | 1        | <null>   |
| 4  | exam_mng     | <null>      | 32        | 1        | <null>   |
| 5  | exam_writer  | <null>      | 32        | 1        | <null>   |
| 6  | exam_viewer  | <null>      | 32        | 1        | <null>   |
| 7  | exam_starter | <null>      | 32        | 1        | <null>   |
+----+--------------+-------------+-----------+----------+----------+

这里是它的代码:-

create table cgroups
(
    id int unsigned primary key auto_increment,
    title varchar(100) not null unique,
    description varchar(255),

    cunixperm  tinyint unsigned not null default 32 ,# r=2 w=1
    cgroup_1   int unsigned not null default 1 references cgroups (id) on delete cascade on update cascade,
    cgroup_2   int unsigned references cgroups (id) on delete cascade on update cascade

);

我想创建将cgroup_1列替换为c_group的实际标题的视图

类似这样:-http://sqlfiddle.com/#!9/7af382/1

select c.id, c.title, c.description, c.cunixperm, c1.title cgroup_1 from cgroups c , cgroups c1 
                             where c.cgroup_1 = c1.id;                                                                                                                                       
+----+--------------+-------------+-----------+----------+
| id | title        | description | cunixperm | cgroup_1 |
+----+--------------+-------------+-----------+----------+
| 1  | admin        | <null>      | 32        | admin    |
| 2  | tag_mng      | <null>      | 32        | admin    |
| 3  | tags         | <null>      | 32        | admin    |
| 4  | exam_mng     | <null>      | 32        | admin    |
| 5  | exam_writer  | <null>      | 32        | admin    |
| 6  | exam_viewer  | <null>      | 32        | admin    |
| 7  | exam_starter | <null>      | 32        | admin    |
+----+--------------+-------------+-----------+----------+

这种方法的问题是,它仅适用于1个引用的列,而我有2个(在其他一些表中为8个)

如果我关注,

select c.id, c.title, c.description, c.cunixperm, c1.title, c2.title 
from cgroups c , cgroups c1, cgroups c2
where c.cgroup_1 = c1.id and c.cgroup_2 = c2.id;

我得到零行。http://sqlfiddle.com/#!9/7af382/4

mysql sql foreign-keys self-join
2个回答
1
投票

无论如何都应该使用草稿,您应该使用显式的joj sintax

select c.id, c.title, c.description, c.cunixperm, c1.title, c.cgroup_1 
from cgroups c 
INNER JOIN cgroups c1  ON c.cgroup_1 = c1.id;

http://sqlfiddle.com/#!9/7af382/3


0
投票

如果我理解正确,那么得到零行是正常的。您将ID与c_group2中的值匹配。在这种情况下,该值始终为null,并且没有id为null,因此找不到匹配项。


0
投票

通过修改caisEdge,答案可以正常工作:-

 select c.id, c.title, c.description, c.cunixperm, c1.title cgroup_1 , c2.title cgroup_2 
 from cgroups c  
 INNER JOIN cgroups c1  ON c.cgroup_1 = c1.id 
 INNER JOIN cgroups c2  ON c.cgroup_2 = c2.id;
© www.soinside.com 2019 - 2024. All rights reserved.