-2

フィールドIDと親を持つテーブル「組織」があります。親は同じテーブルを参照します (自己参照キー)。

「user_organization」という別のテーブルがあり、そこには user_id と org_id があります。org_id は「組織」テーブルの id にリンクされています。

ここで、user_id と organization_id を含むこれら 2 つのテーブルを使用してビューを作成します。1 つの組織のメンバーはすべての子組織のメンバーになるため、このビューには実際の user_organization テーブルからの追加の値が含まれます。

このビューを作成するにはどうすればよいですか?

4

1 に答える 1

0

どうやら、SQL select ステートメントだけでは不可能のようです。

https://stackoverflow.com/a/9056945/721597

しかし、関数の助けを借りて、なんとかそれを行うことができました。

IsRelated(id, parent) という関数を作成しました。これは、id が親に関連しているかどうかを示します (id = 親の場合、それらは関連しています)。

CREATE FUNCTION `IsRelated`(`GivenID` VARCHAR(10), ParentId VARCHAR(10)) RETURNS boolean
BEGIN
    DECLARE related boolean; 
    DECLARE ch INT;

    SET related = FALSE;  
    IF ParentId = GivenID THEN
        SET related = TRUE;
    ELSE
        SET ch = GivenID; 
        myloop: WHILE ch IS NOT NULL DO
            SELECT IF(parent_org_id = ch, NULL, parent_org_id) INTO ch FROM
            (SELECT parent_org_id FROM organizations WHERE id = ch) A;
            IF ch IS NOT NULL AND ch = ParentId THEN
                SET related = TRUE; 
                LEAVE myloop;
            END IF;
        END WHILE; 
    END IF;
    RETURN related;
END

次に、次のようなビューを作成します。

CREATE VIEW `v_all_orgs` AS SELECT o1.id AS org, o2.id AS related_to
FROM organizations o1
JOIN organizations o2 ON IsRelated(o1.id, o2.id)

これら2つを使用して、問題の必要なビューを作成しました:

CREATE VIEW `v_all_user_orgs` AS SELECT DISTINCT user_organizations.user_id, v_all_orgs.org as org_id, user_organizations.created_ts
FROM user_organizations JOIN v_all_orgs ON v_all_orgs.related_to = user_organizations.org_id OR v_all_orgs.org = user_organizations.org_id
ORDER BY user_organizations.user_id, v_all_orgs.org
于 2015-10-24T06:38:26.817 に答える