使用内部联接编写用 SQL 编写的继承查询?

2024-04-16

我承认我的 SQL 知识(使用 mySQL)几乎没有超出数据库管理所需的标准查询,并且我的大部分数据操作都是通过 php 完成的。

我一直渴望改变这一点,并且到目前为止已经取得了成功,如果有人能建议我如何在包含“父”、“子”字段、内部字段的标准表上为继承查询创建存储过程,我将不胜感激。加入权限表。

作为示例数据(用于演示目的):

表组继承

parent        child
------------------------
admin         moderator
member        guest
super_admin   admin
moderator     member

表组权限

moderator    move_post
----------------------
super_admin  create_forum
admin        move_forum
guest        view_post
member       create_post
member       edit_post

然后,我将调用组名称(例如“admin”)上的过程以返回其权限数组(“move_forum”、“view_post”、“create_post”、edit_post“)。我不知道这里是否需要迭代或递归(我读到了一些关于 mySQL 不支持这一点的内容?),但欢迎任何建议。

(注意:我选择不使用权限作为具有 TRUE/FALSE 检查的字段,因为我打算将更多字段附加到每个权限,例如描述)。


如果您正在查看树层次结构,那么嵌套集模型工作得相当好,但涉及继承表结构的重大变化。

如果您正在实现任意有向图(例如,您有一个可以发布文章但不能审核评论的“作者”配置文件,以及可以审核评论但不能发布文章的“主持人”配置​​文件),您可能需要查看寻求其他解决方案。

一种可能是放弃继承并手动为每个组设置权限。

另一种可能性是使用继承表来存储直接继承和间接继承(即,节点将使用“直接”关系与其所有子节点相关,以及使用“间接”关系与其所有后代相关)。此策略要求您在每次更改直接关系之一时重新创建表中的所有间接关系(这可以通过使用简单的方法来完成)INSERT SELECT),但优点是只需要一次连接即可访问所有后代。

基本思想是:

CREATE TABLE group_inherit (
  parent INT NOT NULL, 
  child INT NOT NULL, 
  distance INT NOT NULL, 
  PRIMARY KEY (parent,child)
);

/* Clean up indirect relations */
DELETE FROM group_inherit WHERE distance <> 0;

/* Repeat this for each D > 0 until the maximum distance is reached */
INSERT IGNORE INTO (parent, child, distance) 
SELECT fst.parent, snd.child, D
FROM group_inherit fst
INNER JOIN group_inherit snd ON snd.parent = fst.child
WHERE fst.distance = 0 AND snd.distance = D - 1;

/* Select all permissions for a user type */
SELECT perm.*
FROM group_permissions perm
INNER JOIN group_inherit ON perm.moderator = child
WHERE parent = ?

应该执行距离循环,直到没有更多距离 D-1 的元素可用,这可以使用选择查询来完成,或者如果有的话,可以使用有关插入了多少行的元信息来完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用内部联接编写用 SQL 编写的继承查询? 的相关文章

  • 如何将“mysql source”命令与 mysql 变量一起使用?

    我需要从 mysql shell 执行一个基于如下条件的 SQL 文件 mysql gt 源 var 其中 var 包含文件名 这不可能 source是MySQL客户端程序在本地识别并执行的命令 变量存在于服务器上 因此客户端不知道什么 v
  • 退出 PHP 脚本后终止或停止 MySQL 查询

    我在工作中运行一个统计服务器 由于运行的查询量很大 该服务器有时会变得非常慢 我们的营销团队使用它作为主要统计工具 团队中的某些人有时会在脚本结束之前退出脚本 通过关闭浏览器或选项卡 同时 SQL 查询继续执行 当有人关闭或离开 PHP 脚
  • Oracle - 获取星期几

    今天是星期二 为什么当我运行这个 SQL 语句时 它说今天不是星期二 SELECT CASE WHEN TO CHAR sysdate Day Tuesday THEN Its Tuesday ELSE Its Not Tuesday EN
  • 有没有办法在 MySQL 中有效地对 TRUNCATE 或 DROP TABLE 进行 GRANT ?

    我最近在 MySQL 5 5 x 中尝试过 GRANT SELECT INSERT UPDATE DELETE TRUNCATE ON crawler TO my user localhost WITH GRANT OPTION 这会导致错
  • 计算包含字母/数字的行数

    我想要实现的目标很简单 但是解释起来有点困难 我不知道在 postgres 中这是否真的可能 我处于相当基础的水平 SELECT FROM WHERE LEFT JOIN ON HAVING 等等基本的东西 我正在尝试计算包含特定字母 数字
  • 如何根据条件删除结果以计算平均值

    我有下面的架构 对其的快速解释是 鲍勃评分为 5 5 詹姆斯评分 1 5 梅西百货评分高达 5 5 逻辑 如果我是 A 请查找我屏蔽的所有人 查阅所有电影评论 任何留下电影评论且 personA 已屏蔽的人 请将其从计算中删除 计算电影的平
  • 如何在 SQL Server 中保持数据行内

    我正在尝试找出如何检测数据是否在VARCHAR n SQL Server 2008 中的列存储在行内或行外 有谁知道如何做到这一点 另外 如果我们需要数据 有没有办法将数据保持在行中 要查看某个值是行内还是行外 您可以使用DBCC PAGE
  • 在shell命令行中创建mysql触发器

    我需要在命令行中创建一个mysql触发器 这个sql在mysql控制台中运行良好 sql USE DB1 DROP TRIGGER IF EXISTS my trigger DELIMITER CREATE TRIGGER my trigg
  • Oracle如何将UTC时间转换为本地时间(缺少偏移信息)

    我有一个包含日期列的表 我认为该列中的日期是以 UTC 格式保存的 我希望检索日期时以当地时间打印 这意味着当我从德国调用日期时 结果应该是这样的 2015 04 29 11 24 06 0200UTC EUROPE BERLIN 我尝试了
  • sql server 2008 对 exec 语句的限制

    我只需要仔细检查 t sql 中的 EXEC 命令是否有字符限制 如果我有一个带有 varchar max 的变量并使用 EXEC 执行命令 你认为这样可以吗 thanks 应该没问题 根据这篇 MSDN 文章 http msdn micr
  • Sql Server 的夏令时

    我们正在使用一个以 C Unix 格式存储日期的旧应用程序 C 时间基本上是自 1970 年 1 月 1 日以来的秒数 日期以整数形式存储在 SQL Server 数据库中 我正在为使用这些日期的报告编写视图 到目前为止 我正在使用以下命令
  • 为 java 项目创建安装

    我创建了一个 java 项目 它使用数据库来检索 编辑和保存数据 我使用 Netbeans 完成了该项目 现在我想在该项目之外创建一个安装 为此 我想包含与项目一起安装的数据库 我用来连接数据库的代码是 Class forName com
  • 在 Laravel 中按数据透视表 create_at 排序

    在我的数据库中 我有以下表格 courses id 名称 创建时间 更新时间 students id 名称 创建时间 更新时间 课程 学生 id course id student id created at updated at 我正在尝
  • 如何将彼此“接近”的纬度/经度点分组?

    我有一个用户提交的纬度 经度点的数据库 并且正在尝试将 接近 点分组在一起 接近 是相对的 但目前看来约为 500 英尺 起初 我似乎只能按前 3 个小数位具有相同纬度 经度的行进行分组 大约是一个 300x300 的盒子 了解当您远离赤道
  • 合并两个具有相同列名称的 MYSQL 表

    我有两张桌子 表一是计划时间 id edition time 1 1 9 23am 2 2 10 23am 表二为实际时间 id edition time 1 1 10 23am 2 2 11 23am 我想要的结果是 Caption Ed
  • 删除重复的行并需要在mysql中保留所有行中的一个[重复]

    这个问题在这里已经有答案了 我想删除基于两列的重复行 但需要保留所有行 1 行 重复行可以多于两行 例如 ID NAME PHONE 1 NIL 1234 2 NIL 1234 3 NIL 1234 4 MES 5989 我想从上面 3 行
  • Oracle 按月滚动或运行总计

    目标 每个月末所有报表的滚动 运行总计 Code select TRUNC ACTHX STMT HX STMT DATE MM AS MNTH COUNT ACTHX INVOICE as STMTS from ACTHX group b
  • 如何将事物的组合映射到关系数据库?

    我有一个表 其记录代表某些对象 为了简单起见 我假设该表只有一列 这是唯一的ObjectId 现在我需要一种方法来存储该表中的对象组合 组合必须是唯一的 但可以是任意长度 例如 如果我有ObjectIds 1 2 3 4 我想存储以下组合
  • 创建日期范围表

    我正在编写一份需要显示每天值的报告 我有查询的开始日期和结束日期 但我希望避免丢失日期 以防表不包含特定日期的值 我正在考虑创建一个基本日期范围表 其中包含开始和结束之间的所有日期 然后将其与数据表左连接以显示每一天的值 我找到了一些适用于
  • 使用 md5 加密的 PHP 和 Mysql 查询出现问题

    我使用普通的 php mysql 插入查询并使用 md5 加密密码 这是插入查询 sql mysql query INSERT INTO user username password role approved values usernam

随机推荐

  • 计数累计和

    我想知道是否可以对计数进行累积和 我想举的一个例子是今年影响美国的风暴 我想要一个列出 2014 年月份的结果集 以及该月之前影响美国的风暴累计总数 我希望得到 3 列的内容 Month NumberofStorms 和 Cumulativ
  • Indy FTP EIAcceptTimeout 异常

    我正在测试 IndyFTP 将文件上传到服务器 这文件已上传但有 0 字节因为出现了 EIdAccessTimeout 异常 Accept timed out 我该如何防止该异常 我的代码是否不正确 代码如下所示 procedure TFo
  • 从 perl 中的外部 *nix 命令获取 STDOUT、STDERR 和响应代码

    我想从 Perl 脚本中执行外部命令 将 stdout 和 stderr 的输出放入 variable我的选择 并将命令的退出代码放入 多变的 我经历过解决方案perlfaq8 http perldoc perl org perlfaq8
  • 打印 JTextField 在控制台上显示空白

    我是Java新手 刚刚尝试了Java的swing 我尝试制作一个登录表单 将JTextField的内容打印到控制台 但是当我尝试它时 控制台没有显示任何内容 这是我的代码 import java awt EventQueue import
  • 如何在角度中对取消订阅功能进行单元测试

    我想找到一种方法来测试订阅和主题上的取消订阅函数调用 我想出了一些可能的解决方案 但每一种都有优点和缺点 请记住 我不想出于测试目的而更改变量的访问修饰符 通过反射访问组件的私有变量 在这种情况下 我有一个存储订阅的私有类变量 组件 ts
  • 将 DIV 包裹在 Anchor 标签或其他标签内

    假设我有一个可点击的复合体div链接到另一个页面的元素结构如下 这就是当前通过点击实现的事情 单击 css 活动状态 更改内部背景颜色 a 标记并重定向到其他页面 我想知道这是否符合 HTML5 验证 或者与用div并使用 JavaScri
  • 如何防止 UINavigationBar 在 iOS 7 中覆盖视图顶部?

    更新到 Xcode 5 后 我的所有应用程序视图中的导航栏都下移了 以下是一些屏幕截图 第一个显示了视图中拉下时的所有内容 第二个显示了所有未受影响的内容 搜索栏应从导航栏开始 有人知道我该如何解决这个问题吗 编辑 我之前尝试过这个建议 i
  • java 应用程序冻结 mac os 10.9 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要帮助 我有 mac os 10 9 并安装了 java JDK 1 7 java 版本 java版本 1 7 0 45 Java T
  • (Django) 事件日历的最佳解决方案

    我需要向我的应用程序添加事件日历功能 我想知道您认为最好的方法是什么 是否有任何有趣的项目提供所需的功能 一个片段 http djangosnippets org snippets 129 http djangosnippets org s
  • 在 Perl 中通过索引从数组中排除元素的最佳方法是什么?

    我使用以下代码来排除中的元素 x 在索引处 index 但我不确定这是实现此功能的最有效方法 大家有什么更好的办法吗 sub arrayexclude my x shift my index shift my keep index 0 sc
  • searchkick 不返回带有空格的结果

    所以我有这个 searchckick 方法 search options misspellings edit distance 2 fields eventname date city order score desc date asc e
  • 如何在 Python 中将输入打印为整数、浮点数或字符串

    我的代码的目的是让输出给出输入的数字和类型 例如 如果输入是 10 输出应该是 10 is an integer 如果输入是 10 0 输出应该是 10 0 is a float 如果输入是 Ten 输出应该是 Ten is a strin
  • 具有可变数量参数的 Python itertools.product

    我正在尝试编写一个模块来使用 itertools product 组合可变数量的列表 我能得到的最接近的是 import itertools lists item1 item2 A b C etc searchterms list iter
  • 使用 new 隐藏方法的用例

    这或多或少是一个完全相同的副本这个帖子 https stackoverflow com questions 3117838 why do we need the new keyword and why is the default beha
  • ReactJS:类型错误:this.state.data.map 不是函数

    有人可以帮我解决这个问题吗 我收到此问题标题中描述的错误 我想将 JSON 数据放入react grid layout 组件中 该库可以在 https github com STRML react grid layout https git
  • MS Azure - 错误请求 400

    每次运行这行代码时 我都会收到错误的请求错误 List
  • Glide v4 中的占位符/错误/后备 [重复]

    这个问题在这里已经有答案了 我现在使用的是最新版本的 Glide滑行 4 0 0 RC1并且无法找到占位符 错误 后备等方法 也许他们已经提供了替代方案 但我没有得到它 有人知道这个版本中有替代方案吗 try this RequestOpt
  • “PHP 致命错误:未找到类‘HttpRequest’”

    我一直在尝试以多种方式解决这个问题 阅读了很多帖子 但仍然没有运气 我在 Mac OSX 10 7 Lion 上工作 并且正在使用 MAMP 为 WordPress 站点 php 文件 编写一个插件 并且在某一时刻我必须发出 HTTP 请求
  • 是否有任何正式的方法或已知的方法来规范化 xml 文件以生成差异?

    似乎有很多关于 WRT 工具在 xml 之间生成差异的问题 但还没有这个问题 所以任何知道这个问题的人都会向我展示一个链接或粘贴任何人已经解决了这个问题的示例 规范化 xml 文件意味着 重新排序属性的外观 重新排序标签的外观 可通过命令行
  • 使用内部联接编写用 SQL 编写的继承查询?

    我承认我的 SQL 知识 使用 mySQL 几乎没有超出数据库管理所需的标准查询 并且我的大部分数据操作都是通过 php 完成的 我一直渴望改变这一点 并且到目前为止已经取得了成功 如果有人能建议我如何在包含 父 子 字段 内部字段的标准表