Как присоединить таблицу к себе, когда она ссылается на себя - PullRequest
1 голос
/ 19 февраля 2020

У меня есть таблица, в которой есть два столбца, которые ссылаются на себя.

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 реферируемым столбцом, в то время как у меня есть два (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

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Использование вашей скрипки кажется работой; в любом случае вы должны использовать явный синтаксис соединения:

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

и для двух соединений

select c.id, c.title, c.description, c.cunixperm, c1.title, c.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   
0 голосов
/ 19 февраля 2020

Изменяя 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...