从mysql自引用表和另一个表创建视图

Posted

技术标签:

【中文标题】从mysql自引用表和另一个表创建视图【英文标题】:Create view from mysql self referential table and another table 【发布时间】:2015-10-22 10:04:26 【问题描述】:

我有一个带有字段 id 和 parent 的表“组织”。 parent 引用同一个表(自引用键)。

我有另一个名为“user_organization”的表,其中有 user_id 和 org_id。 org_id 链接到“组织”表中的 id。

现在我想创建一个视图,使用这两个包含 user_id 和 organization_id 的表。由于一个组织的成员将是所有子组织的成员,因此该视图将包含来自实际 user_organization 表的额外值。

如何创建此视图?

【问题讨论】:

我想创建一个包含 user_id 和 organization_id 的视图。 你提到了parent..对..?一个组织有多少个父级? 任意数量的父母。如果parent_id = org_id,那就是第一个组织 你能给出一些示例表和预期的输出吗?并编辑问题? 【参考方案1】:

看来,仅使用 SQL select 语句是不可能的。

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

但在函数的帮助下,我设法做到了。

我创建了一个名为 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

【讨论】:

以上是关于从mysql自引用表和另一个表创建视图的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 视图可以引用来自不同数据集/项目的其他表和视图吗?

SQL Server里面啥样的视图才能创建索引

mysql多表查询并创建视图

7MySQL数据库的视图操作

创建mysql视图时是不是应该在SELECT语句中引用多个表?

SQL创建视图语句?