从 mysql 自引用 table 和另一个 table 创建视图
Create view from mysql self referential table and another table
我有一个 table 'organization' 字段 id 和 parent。 parent 引用相同的 table(自引用键)。
我有另一个名为 'user_organization' 的 table,其中我有 user_id 和 org_id。 org_id 链接到 'organization' table.
中的 ID
现在我想创建一个视图,使用这两个包含 user_id 和 organization_id 的 table。由于一个组织的成员将成为所有子组织的成员,因此此视图将包含来自实际 user_organization table 的额外值。
如何创建此视图?
看来,只有SQL select 声明是不可能的。
但是在函数的帮助下,我做到了。
我创建了一个名为 IsRelated(id, parent) 的函数——它告诉 id 是否与 parent 相关(如果 id = parent 它们是相关的):
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)
有了这两个,我创建了我需要的有问题的视图:
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
我有一个 table 'organization' 字段 id 和 parent。 parent 引用相同的 table(自引用键)。
我有另一个名为 'user_organization' 的 table,其中我有 user_id 和 org_id。 org_id 链接到 'organization' table.
中的 ID现在我想创建一个视图,使用这两个包含 user_id 和 organization_id 的 table。由于一个组织的成员将成为所有子组织的成员,因此此视图将包含来自实际 user_organization table 的额外值。
如何创建此视图?
看来,只有SQL select 声明是不可能的。
但是在函数的帮助下,我做到了。
我创建了一个名为 IsRelated(id, parent) 的函数——它告诉 id 是否与 parent 相关(如果 id = parent 它们是相关的):
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)
有了这两个,我创建了我需要的有问题的视图:
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