【问题标题】:Database joins with three tables, one is a category / tag table数据库连接三张表,一张是类别/标签表
【发布时间】:2010-07-16 15:19:22
【问题描述】:

我有三个数据库表 - 一个包含单元,一个包含这些单元的类别,一个包含用户权限。

如果用户可以访问某个类别,则他们可以访问该类别中的任何单元。

我正在尝试创建一个查询,该查询将检索他们被允许访问的单位列表。到目前为止,我有一个非常尴尬的查询返回重复,并且有点卡住,现在是星期五下午,我想回家!

这是我的桌子:

单位类别

categoryid     unitid

单位

id             name

UnitCategoryUser

unitid         userid         categoryid
               - can be null  - can be null

谢谢

【问题讨论】:

    标签: sql join tags


    【解决方案1】:

    我怀疑 UnitCategoryUser 被用作用户、类别和单位之间关系的全能表 - 因此单位被记录为属于用户 ID 为空的记录上的类别,并且用户可以访问单位,即使他们无权访问他们的类别,其中 categoryid 为空。

    单位也可能属于多个类别,并且用户被记录为能够多次访问相同的单位 - 在这两种情况下,用户都可以访问多个类别(每个类别都可以访问同一个单位) 并且当用户被授予访问某个单元但没有访问该类别的权限时,随后被授予访问该类别的权限。

    以下查询应返回指定用户的所有单位:

    select distinct u.name
    from unit u 
    join unitcategory uc on u.id = uc.unitid
    join unitcategoryuser ucu on uc.category_id = ucu.categoryid
    where ucu.userid = YourUserID
    union
    select distinct u2.name
    from unit u2
    join unitcategoryuser ucu2 on u2.id = ucu2.unitid
    where ucu2.userid = YourUserID
    

    【讨论】:

    • 我的问题应该更清楚 - 你猜对了,感谢你简洁的回答。
    【解决方案2】:
    SELECT U.Name
    FROM UnitCategoryUser UCU
    JOIN UnitCategory UC ON UC.categoryid = UCU.categoryid
    JOIN Unit U ON U.id = UC.UnitId
    WHERE UCU.UserId = YourUserId
    

    这不会返回您的正确数据吗?我可能遗漏了一些东西:x

    【讨论】:

      【解决方案3】:

      从单元、单元类别、单元类别用户中选择单元名称 其中 unit.id = unitcategory.unitid 和 unitcategory.categoryid = unitcategoryuser.categoryid 和 unitcategoryuser.userid = "我"

      类似的东西?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-03
        • 1970-01-01
        • 1970-01-01
        • 2011-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多