如题,我现在想实现数据库模板列显示主键所在的二级标题,我用的是这个模板 基于思源笔记的数据库使用分享 (附模板)
其中的项目列会自动获取任务所在的文档名称,我希望能继续获取任务对应的二级标题名称显示在后面
比如下图,文档名称是工作备忘,想多显示工时登记这个任务对应的二级标题工时/周报,最后模板列输出工作备忘-工时/周报,请大佬帮忙实现,感谢。
如题,我现在想实现数据库模板列显示主键所在的二级标题,我用的是这个模板 基于思源笔记的数据库使用分享 (附模板)
其中的项目列会自动获取任务所在的文档名称,我希望能继续获取任务对应的二级标题名称显示在后面
比如下图,文档名称是工作备忘,想多显示工时登记这个任务对应的二级标题工时/周报,最后模板列输出工作备忘-工时/周报,请大佬帮忙实现,感谢。
刚才看你代码,感觉你这里的主键 id 应该是块 id,不是文档 id,上面的 SQL 仅对主键 id 是文档 id 才有效
如果主键是块 id,加上模板仅支持 select * 查询
需要用下面的 SQL,分别查询标题和 h2,然后用模板函数 cat 拼接到一起
查标题还用你之前的 SQL 就行
select * from blocks where id in (select root_id from blocks where id='20250401135156-8k4wks2');
查 h2 用下面这个,通过 parent_id 递归查询
WITH RECURSIVE ancestors AS ( -- 初始查询:从已知 id 开始 SELECT * FROM blocks WHERE id = '20250401135156-8k4wks2' UNION ALL -- 递归查询:通过 parent_id 向上遍历 SELECT b.* FROM blocks b INNER JOIN ancestors a ON b.id = a.parent_id ) -- 最终查询:筛选满足条件的记录 SELECT content as h2 FROM ancestors WHERE type = 'h' AND subtype = 'h2';
别忘了在模板中具体 id 值改成?号
转换为模板代码示例如下
.action{ $h2Blocks := queryBlocks `WITH RECURSIVE ancestors AS (SELECT * FROM blocks WHERE id = '?' UNION ALL SELECT b.* FROM blocks b INNER JOIN ancestors a ON b.id = a.parent_id) SELECT * FROM ancestors WHERE type = 'h' AND subtype = 'h2'` .id } .action{ $blocks := queryBlocks "select * from blocks where id in (select root_id from blocks where id='?')" .id } .action{ if and (not (empty $blocks)) (not (empty $h2Blocks)) } .action{ $blockContent := (cat (first $blocks).Content "-" (first $h2Blocks).Content ) } .action{$blockContent} .action{ end }
模板中用 cat 函数会在 - 前后产生一个空格,如果不想要这个空格,如下解决
把
.action{ $blockContent := (cat (first $blocks).Content "-" (first $h2Blocks).Content ) }
改为
.action{ $blockContent := (list (first $blocks).Content (first $h2Blocks).Content | join "-") }
简单方式,分开查询,然后用模板拼接起来应该可以吧
select content as title from blocks where id = '20250126175945-876nap9'; select content as h2 from blocks where root_id='20250126175945-876nap9' and type = 'h' and subtype='h2';
或者合并到一条 SQL
SELECT (SELECT content FROM blocks WHERE id = '20250126175945-876nap9') AS title, (SELECT content FROM blocks WHERE root_id = '20250126175945-876nap9' AND type = 'h' AND subtype = 'h2') AS h2;
或者用 join
SELECT b1.content AS title, b2.content AS h2 FROM blocks b1 LEFT JOIN blocks b2 ON b1.id = '20250126175945-876nap9' AND b2.root_id = '20250126175945-876nap9' AND b2.type = 'h' AND b2.subtype = 'h2' WHERE b1.id = '20250126175945-876nap9' LIMIT 1;
刚才看你代码,感觉你这里的主键 id 应该是块 id,不是文档 id,上面的 SQL 仅对主键 id 是文档 id 才有效
如果主键是块 id,加上模板仅支持 select * 查询
需要用下面的 SQL,分别查询标题和 h2,然后用模板函数 cat 拼接到一起
查标题还用你之前的 SQL 就行
select * from blocks where id in (select root_id from blocks where id='20250401135156-8k4wks2');
查 h2 用下面这个,通过 parent_id 递归查询
WITH RECURSIVE ancestors AS ( -- 初始查询:从已知 id 开始 SELECT * FROM blocks WHERE id = '20250401135156-8k4wks2' UNION ALL -- 递归查询:通过 parent_id 向上遍历 SELECT b.* FROM blocks b INNER JOIN ancestors a ON b.id = a.parent_id ) -- 最终查询:筛选满足条件的记录 SELECT content as h2 FROM ancestors WHERE type = 'h' AND subtype = 'h2';
别忘了在模板中具体 id 值改成?号
转换为模板代码示例如下
.action{ $h2Blocks := queryBlocks `WITH RECURSIVE ancestors AS (SELECT * FROM blocks WHERE id = '?' UNION ALL SELECT b.* FROM blocks b INNER JOIN ancestors a ON b.id = a.parent_id) SELECT * FROM ancestors WHERE type = 'h' AND subtype = 'h2'` .id } .action{ $blocks := queryBlocks "select * from blocks where id in (select root_id from blocks where id='?')" .id } .action{ if and (not (empty $blocks)) (not (empty $h2Blocks)) } .action{ $blockContent := (cat (first $blocks).Content "-" (first $h2Blocks).Content ) } .action{$blockContent} .action{ end }
模板中用 cat 函数会在 - 前后产生一个空格,如果不想要这个空格,如下解决
把
.action{ $blockContent := (cat (first $blocks).Content "-" (first $h2Blocks).Content ) }
改为
.action{ $blockContent := (list (first $blocks).Content (first $h2Blocks).Content | join "-") }
React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。
Logseq 是一个隐私优先、开源的知识库工具。
Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.
Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。
Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。
一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。
Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。
你比 99% 的人都优秀么?
用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖。
用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/
百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。
链滴是一个记录生活的地方。
记录生活,连接点滴
我来 wolai:不仅仅是未来的云端笔记!
Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。
快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。
有什么新发现就分享给大家吧!
JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。
禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。
Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。
小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。
由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!
微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。
SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
即用的 Vim-IDE。
Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。
红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。