我正在扩展我们的用户/组系统,以允许由其他组成员组成的动态组。我有三个表users
,groups
和relationships
。
为简单起见,我们假设用户只包含一个字段user_id
,而组仅包含group_id
。 relationships
使用三个字段:user_id
,group_id
,related_group_id
来表示用户到组和组到组关系。
动态填充的组层次结构类似于:
用户A, B, C
属于群组1
,用户D, E, F
属于群组2.所有这些都在关系表中表示为({{1 },user_id
):
group_id
动态组A,1
B,1
C,1
D,2
E,2
F,2
将有两个组到组关系记录(3
,group_id
):
related_group_id
为了更好地说明我的问题,我们可以添加动态群组3,1
3,2
并让其包含群组4
:
3
汇总了我对MySQL 4,3
所学到的知识,我创建了以下名为CURSOR
的存储过程:
fetch_inheritance_groups
...用......来调用。
DROP PROCEDURE IF EXISTS `fetch_inheritance_groups`;
CREATE PROCEDURE `fetch_inheritance_groups`(IN parent_id INT)
READS SQL DATA
BEGIN
DECLARE inherit_id char(32);
DECLARE eol BOOLEAN;
DECLARE inherit_cur CURSOR FOR SELECT r.Related_Group_ID FROM usr_relationships r WHERE r.Group_ID = parent_id AND r.Related_Group_ID IS NOT NULL;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET eol = TRUE;
OPEN inherit_cur;
inherited: LOOP
FETCH inherit_cur INTO inherit_id;
IF eol
THEN
CLOSE inherit_cur;
LEAVE inherited;
ELSE
CALL fetch_inheritance_groups(inherit_id);
END IF;
SELECT inherit_id;
END LOOP inherited;
END;
...并返回
的预期结果CALL fetch_inheritance_groups(4);
这里开始我的问题,它们作为三个单独的结果集而不是单个结果集中的三行返回,其次,结果意味着在如下的查询中使用:
3
2
1
所以我希望有人能回答的三个问题是:
1。我应该在这里使用SELECT r.uer_id FROM relationships r WHERE r.group_id = 4 OR r.group_id IN (CALL fetch_inheritance_groups(4));
还是有替代方法可以获得相同的递归结果?
2。如何将结果返回到单个结果集中,以便可以与子选择相同的方式使用?
第3。使用CURSOR
的结果的正确方法是什么,因为我至少在我尝试过的时候不能让上面的示例SELECT语句工作?我相信这是因为我无法使用CALL
内联,但我不确定。