使用存储过程和CURSOR在MySQL中进行递归查询

时间:2014-01-31 05:04:03

标签: mysql stored-procedures tree cursor recursive-query

我正在扩展我们的用户/组系统,以允许由其他组成员组成的动态组。我有三个表usersgroupsrelationships

为简单起见,我们假设用户只包含一个字段user_id,而仅包含group_idrelationships使用三个字段:user_idgroup_idrelated_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 将有两个组到组关系记录(3group_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内联,但我不确定。

0 个答案:

没有答案