如题,我现在想实现数据库模板列显示主键所在的二级标题,我用的是这个模板 基于思源笔记的数据库使用分享 (附模板)
其中的项目列会自动获取任务所在的文档名称,我希望能继续获取任务对应的二级标题名称显示在后面
比如下图,文档名称是工作备忘,想多显示工时登记这个任务对应的二级标题工时/周报,最后模板列输出工作备忘-工时/周报,请大佬帮忙实现,感谢。
如题,我现在想实现数据库模板列显示主键所在的二级标题,我用的是这个模板 基于思源笔记的数据库使用分享 (附模板)
其中的项目列会自动获取任务所在的文档名称,我希望能继续获取任务对应的二级标题名称显示在后面
比如下图,文档名称是工作备忘,想多显示工时登记这个任务对应的二级标题工时/周报,最后模板列输出工作备忘-工时/周报,请大佬帮忙实现,感谢。
刚才看你代码,感觉你这里的主键 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 "-") }
刚才看你代码,感觉你这里的主键 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;
uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。
Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。
JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。
锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。
一些有用的避坑指南。
你听到信仰的声音了么?
Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。
Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。
Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。
开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。
本标签主要用于分享网络空间安全专业的学习笔记
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。
发布对别人有帮助的原创内容是最好的 SEO 方式。
Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。
Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。
提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。
LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。
心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。
LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!
用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖。
用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/
Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。
这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!
JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。