在有关资源、主题和章节的规范化数据库中使用 GROUP BY 进行 JOIN

2024-04-17

我已经规范化了我的数据库,但似乎无法以正确的方式返回我正在寻找的数据。

我有 5 张桌子:

  1. 资源(5 个资源)
  2. 主题(10 个主题)
  3. 章节(10 章)
  4. 主题到资源(18 个主题到资源链接)
  5. 主题到章节(18 个主题到章节的链接)

看看这个SQL小提琴 http://sqlfiddle.com/#!9/af2462/13...

我需要收集资源表中的所有记录,并将每个记录与其相应的主题和章节分组(来自主题到资源和主题到章节表)

谁能建议正确的 SQL 查询来返回 5 条资源记录及其参与的主题和章节?

我尝试过使用 GROUP BY 进行 JOINS,这将记录集压缩为 5 个资源,但没有包含我需要的所有其他信息(主题和章节)。

SELECT * FROM TOPICS, CHAPTERS, RESOURCES AS RES
INNER JOIN TOPICS_to_RESOURCE AS TR ON RES.RES_ID = TR.TR_RESID
INNER JOIN TOPICS_to_CHAPTER AS TCH ON TR.TR_TID = TCH.TCH_TID
GROUP BY RES.RES_ID

我无法真正区分您想要实现的目标,但听起来您只是想获得一个显示每个章节及其主题和资源的表格。

如果是这样,则执行以下 SQL:

select * from resources r
JOIN topics_to_resource ttr ON ttr.tr_resid = r.res_id
JOIN topics t on t.t_id = ttr.tr_tid
JOIN topics_to_chapter ttc on ttc.tch_tid = t.t_id
JOIN chapters ch ON ch.ch_id = tch_chid
ORDER BY r.res_id;

将返回这样的结果,按照http://sqlfiddle.com/#!9/ddf252/12 http://sqlfiddle.com/#!9/ddf252/12

或者,忽略选择中的连接 ID:

select r.res_id, r.res_name, t.t_id, t.t_name, ch.ch_id, ch.ch_name from resources r
JOIN topics_to_resource ttr ON ttr.tr_resid = r.res_id
JOIN topics t on t.t_id = ttr.tr_tid
JOIN topics_to_chapter ttc on ttc.tch_tid = t.t_id
JOIN chapters ch ON ch.ch_id = tch_chid
ORDER BY r.res_id, t.t_id, ch.ch_id

as per http://sqlfiddle.com/#!9/ddf252/14 http://sqlfiddle.com/#!9/ddf252/14

如果这不是您想要的,您能否详细说明一下您想要看到的结果?

Edit:返回包含所有关联记录的更简洁的列表

select 
CONCAT(r.res_id,': ',r.res_name) 'Resources', 
GROUP_CONCAT(CONCAT(' (',t.t_id,': ',t.t_name,')')) 'Topics', 
GROUP_CONCAT(CONCAT(' (',ch.ch_id,': ',ch.ch_name,')')) 'Chapters'
from resources r
JOIN topics_to_resource ttr ON ttr.tr_resid = r.res_id
JOIN topics t on t.t_id = ttr.tr_tid
JOIN topics_to_chapter ttc on ttc.tch_tid = t.t_id
JOIN chapters ch ON ch.ch_id = tch_chid
GROUP BY r.res_id
ORDER BY r.res_id, t.t_id, ch.ch_id

As per http://sqlfiddle.com/#!9/ddf252/30 http://sqlfiddle.com/#!9/ddf252/30

Finally,按章节和主题对它们进行分组:

select 
CONCAT(res_id,': ',res_name) 'Resources', 
GROUP_CONCAT(`chapters` order by chapters separator '\n') as 'Content'
FROM
  (SELECT r.res_id 'res_id',
          r.res_name 'res_name', 
          t.t_id 't_id',
          t.t_name 't_name',
          CONCAT(t.t_name,': (',GROUP_CONCAT(ch.ch_name ORDER BY t.t_name separator ','),')') 'Chapters'
    FROM resources r
      JOIN topics_to_resource ttr ON ttr.tr_resid = r.res_id
      JOIN topics t on t.t_id = ttr.tr_tid
      JOIN topics_to_chapter ttc on ttc.tch_tid = t.t_id
      JOIN chapters ch ON ch.ch_id = tch_chid
    GROUP BY res_id, t_id
    ORDER BY r.res_id, t.t_id, ch.ch_id) as t
GROUP BY res_id

正如这里所见:http://sqlfiddle.com/#!9/ddf252/85 http://sqlfiddle.com/#!9/ddf252/85

我已经检查了结果,它们看起来不错 - 但请仔细检查,因为它有点像我脑海中的 MySQL Inception(这里已经是凌晨 1 点了)

进一步补充:每个资源都有不同的价值

    select CONCAT(r.res_id,': ',r.res_name) 'Resources', GROUP_CONCAT(distinct t_name separator ',') 'Topics', 
GROUP_CONCAT(distinct ch.ch_name separator ',') 'Chapters'
from resources r
JOIN topics_to_resource ttr ON ttr.tr_resid = r.res_id
JOIN topics t on t.t_id = ttr.tr_tid
JOIN topics_to_chapter ttc on ttc.tch_tid = t.t_id
JOIN chapters ch ON ch.ch_id = tch_chid
GROUP BY r.res_id
ORDER BY r.res_id, t.t_id, ch.ch_id

See http://sqlfiddle.com/#!9/ddf252/88 http://sqlfiddle.com/#!9/ddf252/88

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

在有关资源、主题和章节的规范化数据库中使用 GROUP BY 进行 JOIN 的相关文章

  • mysql CLI 工具是否提供了一种以控制台友好的方式显示二进制数据的方法?

    我有一个 MySQL 数据库 其中包含一个带有二进制类型列的表 我希望能够投影该列而不必运行它 例如 HEX 是否mysqlCLI 工具有一个配置选项或其他方式来显示二进制数据的表示形式 而不会输出任意字节供我的控制台以搞笑 烦人的方式解释
  • mysql 日期与 date_format 的比较

    我用谷歌搜索并尝试了几种方法来比较日期 但不幸的是没有得到预期的结果 我的当前记录状态如下 mysql gt select date format date starttime d m Y from data date format dat
  • TSQL动态确定SP/Function的参数列表

    我想将通用日志记录片段写入存储过程集合中 我写这篇文章是为了对我们的前端用户体验进行定量测量 因为我知道前端软件使用了哪些 SP 以及它们的使用方式 我想在开始性能调优之前使用它来收集基线 然后显示调优的结果 我可以动态地从 PROCID
  • getArray 上的 SQLFeatureNotSupportedException

    使用 MySQL 5 5 STS 2 9 2 mysql connector java 5 1 21 bin jar 我想从 ResultSet 中获取一个数组 所以我这样编码 try Connection conn DriverManag
  • 未找到列:1054 未知列 laravel

    所以我尝试用 laravel 制作一个表单 但除了新版本之外 他们删除了表单 但我可以让它运行 所以这里是 Route post register function user new User user gt u n Input get u
  • SQL Server 2008 排序规则冲突 - 如何解决?

    为了简化 POC 我使用字符类型列进行以下查询 select AH NAME1 from GGIMAIN SYSADM BW AUFTR KOPF union select AH NAME1 from GGI2014 SYSADM BW A
  • 如何抑制输出并检查命令是否成功?

    我正在尝试编写一个 powershell 脚本来测试 MySQL 登录是否成功 检查是否发生错误 我还想抑制命令的所有输出 成功或不成功 这些是我尝试过的事情 mysql u root password mypass e show data
  • Mysql2::错误:字符串值不正确

    我有一个在生产模式下运行的 Rails 应用程序 但是今天当用户尝试保存记录时突然出现此错误 Mysql2 Error Incorrect string value 更多详细信息 来自生产日志 Parameters utf8 gt lt 9
  • 使用 KMS 的 AWS RDS 加密是否会影响性能?

    Amazon states https aws amazon com about aws whats new 2015 01 06 amazon rds encryption with kms mysql postgresql that 加
  • 对于我的智力来说,太多的 order by、max、子查询

    我似乎无法解决这个问题 我确信它需要子查询 但我没有选择 我的大脑无法处理这个或其他事情 我需要帮助 小介绍 我有一个投注赔率网站 每 15 分钟 我都会从不同的博彩公司导入特定赛事的最新赔率 赢 平 输 或 1 X 2 赔率表的每一行都有
  • 带汇总总计和小计

    我有一个脚本可以生成几乎已经存在的结果集 我正在尝试获取小计和总计 我在年份栏中得到了小计 在最后得到了总计 我的目标是让最终结果显示 总计 而不是小计 请注意 由于汇总函数 我的最后一行 位置 也返回为空 SELECT YEAR COUN
  • Sql Server 2005 将列名放在方括号中

    我最近将数据库从 Sql Server 2000 迁移到 Sql Server 2005 在表设计器中 它坚持将方括号放在名为 Content 的列周围 我在 Sql Server 的保留字列表中没有看到 Content 所以我不明白它为什
  • Bash 脚本 Mysql 警告:在命令行界面上使用密码可能不安全

    你好 我有一个脚本来对一些 mysql 数据库进行分区 我们正在从 5 5 升级到 5 6 在测试脚本时 我注意到新的 5 6 版本 mysql 返回Warning Using a password on the command line
  • 在 SQL Server 中增加一个整数

    菜鸟问题在这里 每次我更改 SQL Server 2008 R2 表中的某个记录时 我都想增加一条 RevisionId 记录 为此 我使用以下语法 UPDATE TheTable SET RevisionId SELECT Revisio
  • 如何在 postgresql 的“tablefunc”查询中包含空值?

    我正在尝试使用crosstab http www postgresql org docs 9 1 static tablefunc html函数于postgresql创建一个pivot table 但是 我很难理解如何在查询中构建 SQL
  • PHP 内部的连接分解

    我看到一篇关于连接分解的文章 场景 1 不好 Select from tag Join tag post ON tag post tag id tag id Join post ON tag post post id post id Whe
  • 如何调试没有错误消息的错误?

    如何调试没有错误消息的错误 当加载 PHP 页面时 我在 Firefox 中收到此错误 The connection to the server was reset while the page was loading 除了看起来是 Apa
  • 何时在 SQL 语句中使用单引号?

    我知道当我处理 TEXT 类型的数据时应该使用它 我猜是那些回退到 TEXT 的数据 但这是唯一的情况吗 Example UPDATE names SET name Mike WHERE id 3 我正在用 C 编写 SQL 查询自动生成
  • 通过页面打开 mysql 连接是完全鲁莽的吗?

    当查询数据库时 是否会感到极度偏执 每次必须完成新查询时 我都会打开和关闭 mysql 连接 我担心 尤其是启用 ajax 的页面 这会导致性能大幅下降 我应该继续使用此方法 还是至少在每个页面 而不是每个查询 中打开和关闭连接一次 顺便说
  • ALL 的 SQL 参数

    我想知道SQL中是否有一个参数适用于所有 不是 例如 我现在正在编写一个搜索表 如果用户不在文本框中输入某些内容 则意味着忽略该特定参数并显示该字段的所有内容 我知道您可以为每种情况创建单独的 OLEDB 或 SQL 命令 并且它会起作用

随机推荐

  • 如何在初始化数据库时显示启动屏幕?

    我创建了一个启动画面 效果非常好 现在我想在显示启动屏幕的同时加载数据库 并在数据库完全加载后显示应用程序 UI 我有以下代码来执行此操作 对吗 public class Splash extends Activity Override p
  • 从 MySQL 中的字符串中删除引号和逗号

    我正在从一个导入一些数据CSV文件 以及大于的数字1000变成1 100 etc 有什么好方法可以从中删除引号和逗号 以便我可以将其放入int field Edit 数据实际上已经在 MySQL 表中 所以我需要能够使用 SQL 来完成此操
  • JavaScript 正则表达式 - g 修饰符不起作用[重复]

    这个问题在这里已经有答案了 我有以下代码 var str 4 shnitzel 5 ducks var rgx new RegExp 0 9 g console log rgx exec str chrome 和 firefox 上的输出是
  • 如果Bokeh有很多图表,输出文件很重并且系统很慢

    我使用散景 我非常喜欢Bokeh 因为Bokeh有很多图表并且输出文件非常简单 我在半导体公司工作 有时我会分析半导体 数据 我有很多数据 我制作了很多图表 可能是 1000 4000 次图表操作 我用Bokeh来制作图表 但是Bokeh很
  • 在 PowerShell 中检查路径是否存在的更好方法[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 PowerShell 中是否有更简洁且不易出错的方法来检查路径是否不存在 对于这样一个常见的用例来说 客观上来说太冗长了 if not Test
  • Symfony2 创建自己的编码器来存储密码

    我是 Symfony2 的新手 我可能有一个关于在数据库中编码用户密码的简单问题 我想以这种方式编码并存储在数据库中我的用户密码 encoded password salt sha1 salt raw password 我找到了各种编码器
  • 是Pythonic吗:命名lambdas

    我开始欣赏 python 中 lambda 表达式的价值 特别是在函数式编程方面 map 函数返回函数 https stackoverflow com a 16509 1533474等等 但是 我也在函数中命名 lambda 因为 我多次需
  • fseek() 按行而不是字节?

    我有一个可以逐行解析大文件的脚本 当它遇到无法处理的错误时 它会停止 通知我们解析的最后一行 这真的是寻找文件中特定行的最佳 唯一方法吗 fseek 在我的情况下不可用
  • ASP.NET 日期和时间选择器?

    我将 ASP NET 2 0 与 SQL Server 2005 结合使用 我希望用户选择日期和时间 然后将这些值保存到数据库中 在 VS 中 我可以使用日历控件来获取日期 但是处理用户选择的日期以及用户还必须从控件中选择的时间有什么好处
  • 如何删除 Rmd 输出到 PDF 中代码块之间的空白?

    如何删除图表末尾与下一个图表之间的多余空白 我有一个闪亮的应用程序 运行参数化的 Rmd 输出为 html 和 PDF html 很好 但 PDF 中有太多空白 我应该将所有内容都放入两页中 因此边距 几何形状很软 但是我需要在第 1 页底
  • 使用 LaTeX,如何在每个部分的末尾提供参考文献列表? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想为每个部分生成参考书目 并将其放在该部分的末尾 当我现在这样做时 它会生成完整的参考书目并将其放置在每个部分之后 有没有办法可以做到这一点 建议h
  • AFJSONRequestOperation 数组填充,但无法在成功块之外填充 NSLog 内容

    以下代码摘自本教程 http mobile tutsplus com tutorials iphone ios sdk afnetworking 我以前用过这个片段 但之前从未注意到这个问题 数组内容的 NSLog 在委托方法中打印 但不在
  • Socket IO 涉及磁盘 IO 吗?

    如果一个进程通过套接字向同一台机器上的另一个进程发送数据 传输过程中发生磁盘读 写的可能性有多大 似乎有一个套接字文件类型 如果有空闲内存 这些文件是否保证在内存中 不直接 TCP UDP 网络套接字 本地主机或 UNIX 域套接字将在内存
  • 使用 NumPy 的数据类型大小

    在 NumPy 中 我可以通过以下方式获取特定数据类型的大小 以字节为单位 datatype itemsize or datatype nbytes 例如 np float32 5 itemsize 4 np float32 5 nbyte
  • 如何从给定 C# 链接的特定 GitHub 存储库中获取文件列表?

    如何从 GitHub 链接获取文件列表 例如 来自此 GitHub 存储库链接 https github com crs2007 ActiveReport tree master ActiveReport SQLFiles 我们可以看到有S
  • 自动执行 rake 任务以在 Heroku 上启动时运行?

    假设有一个任务 rake startupscript 它应该在应用程序启动时运行 我们如何在heroku上自动化它 我知道有一个 heroku 调度程序 但它会每 10 分钟运行一次任务 而不是只在启动时运行一次 我也知道Procfile
  • 如何撤消“git add --intent-to-add”

    当我跑步时git add intent to add 所有未跟踪的文件都从 未跟踪的文件 更改了状态 git status s showed 到 未暂存提交的更改 git status s现在显示A 现在 每当我跑步时git diff我也看
  • GNU Radio OOT 模块 AttributeError:“模块”对象没有属性“MME_cpp”

    我知道这个问题以前曾被问过 但我没有找到有用的解决方案 完整的错误是 Executing home mint Documents test sensor cycl test top block py Using Volk machine a
  • 如何标记条件编译的use语句? [复制]

    这个问题在这里已经有答案了 是否可以将某些包含标记为仅包含在相关操作系统中 例如 你可以这样做 cfg unix use std os unix io IntoRawFd cfg windows https doc rust lang or
  • 在有关资源、主题和章节的规范化数据库中使用 GROUP BY 进行 JOIN

    我已经规范化了我的数据库 但似乎无法以正确的方式返回我正在寻找的数据 我有 5 张桌子 资源 5 个资源 主题 10 个主题 章节 10 章 主题到资源 18 个主题到资源链接 主题到章节 18 个主题到章节的链接 看看这个SQL小提琴 h