如何使用 query 筛选特定文档

本贴最后更新于 195 天前,其中的信息可能已经事过景迁

最近创建了一个电影库,如图所示

截屏 2024112213.12.17.png

我想建立一个数据库分类已看和未看,目前的语句是

select * from blocks where markdown like '%已看%' and type ='t' ORDER BY updated desc

但是返回的是

截屏 2024112213.15.58.png

请问我如何才能只显示符合条件的文档标题而不是显示这么一大串呢?

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    25811 引用 • 106849 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    9900 引用 • 45003 回帖 • 78 关注

相关帖子

被采纳的回答
  • wilsons 1

    确实这里 SQL 写法不对,因为你查找的是文档中的子块内容,所以要先查询子块,然后按 root_id 去重后再查文档数据。

    大概是如下的 SQL,仅仅是伪代码举例说明,没有测试,仅供学习参考

    select '[' || content || '](siyuan://blocks/' || id || ')' AS __1____pre__文档标题 from blocks where type ='d' and id in ( select distinct root_id from blocks where markdown like '%已看%' and type ='t' ) ORDER BY updated desc

    注意,如果用下面的 SQL 脚本,select '[' || content || '](siyuan://blocks/' || id || ')' AS __1____pre__文档标题 换成 select *

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 可以看下 query 挂件的文档, 前面写法不同

    1 回复
  • zflperson via macOS

    我鼓捣到现在也没搞明白,大神能教教我吗 😭

  • 方法一,SQL 查询挂件

    select '[' || content || '](siyuan://blocks/' || id || ')' AS __1____pre__文档标题 from blocks where markdown like '%已看%' and type ='d' ORDER BY updated desc

    方法二,SQL 查询脚本(在文档中输入{{}},把下面代码粘贴到输入框即可)

    //!js return (async () => { // sql查询语句 const sql = `select * from blocks where markdown like '%已看%' and type ='d' ORDER BY updated desc`; // 查询数据库 const result = await query(sql); // 渲染结果 return renderFields('content'); /////// 功能函数区 /////// // 渲染字段 // 调用示例 // renderFields('content, created'); 或 renderFields(['content', 'created']) // 或 renderFields('content, created', (value, field, result) => {return field === 'created' ? value.substring(0, 10) : value;}); function renderFields(fields, callback, style) { let html = ''; callback = callback || ((value, field) => {return value;}); if(typeof result === 'string') return error(result); result.forEach(item => { if(typeof fields === 'string') { fields = fields.split(',').map(field => field.trim()); } let fieldsHtml = ''; fields.forEach((field, i) => { if(field === '') return; if(fieldsHtml === '') { fieldsHtml += `<span data-type="block-ref" data-id="${item.id}" data-subtype="d" style="${style}">${callback(item[field], field, result)}</span>`; } else { fieldsHtml += `<span style="margin-left:20px;${style}">${callback(item[field], field, result)}</span>`; } }); html += `<div class="protyle-wysiwyg__embed" data-id="${item.root_id}"><div data-node-index="1" data-type="NodeParagraph" class="p" updated=""><div contenteditable="true" spellcheck="false">${fieldsHtml}</div><div class="protyle-attr" contenteditable="false"></div></div></div>`; }); return render(html || '<div style="color:var(--b3-theme-secondary);margin-top:3px;">没有找到符合条件的内容</div>'); } // 查询SQL函数 async function query(sql) { const result = await fetchSyncPost('/api/query/sql', { "stmt": sql }); if (result.code !== 0) { console.error("查询数据库出错", result.msg); return "查询数据库出错:" + result.msg; } return result.data; } // 渲染结果函数 function render(html, style) { onRender('.b3-form__space--small').then((container) => { style = style || ''; if(style){ html = `<div class="protyle-wysiwyg__embed" style="${style}">${html}</div>`; } container.outerHTML = html; }); return []; } // 渲染错误输出 function error(html, style) { return render(`<div style="margin-top:3px;">${html}</div>`, style || 'color:red;'); } // 监听dom渲染 function onRender(selector) { return new Promise(resolve => { const check = () => { let el = item.querySelector(selector); if (el) resolve(el); else requestAnimationFrame(check); }; check(); }); } })();

    注意,以上 SQL 需要把你 SQL 中的 type='t'改为 type='d'。

    1 回复
  • zflperson via macOS

    感谢你的回复

    方法 1,复制到 query 挂件点击查询,按钮显示红色,没有查询结果。查询思源文档好像是 type 是 d 的类型只会查询文档标题,不会查询内容。

    方法 2,复制到潜入块,返回显示没有符合条件的内容,我估计是因为文字是放在表格内的,所以查不到。

    不过我现在已经放弃用 SQL 语句来汇总了,我现在使用数据库来汇总,就是自己麻烦一点 😂 效果还是不错的。

    像这些比较专业的语句对非计算机专业的来说还是有点难度,我大部分语句都是 GPT 生成的,鼓捣鼓捣能用就行 😭

    截屏 2024112501.08.23.png

    1 回复
  • wilsons 1

    确实这里 SQL 写法不对,因为你查找的是文档中的子块内容,所以要先查询子块,然后按 root_id 去重后再查文档数据。

    大概是如下的 SQL,仅仅是伪代码举例说明,没有测试,仅供学习参考

    select '[' || content || '](siyuan://blocks/' || id || ')' AS __1____pre__文档标题 from blocks where type ='d' and id in ( select distinct root_id from blocks where markdown like '%已看%' and type ='t' ) ORDER BY updated desc

    注意,如果用下面的 SQL 脚本,select '[' || content || '](siyuan://blocks/' || id || ')' AS __1____pre__文档标题 换成 select *

    1 回复
  • zflperson via macOS

    非常感谢,query 查询已符合要求!

    嵌入块输入代码会把所有符合条件的文档的全部内容都列举出来了,这好像是嵌入块的特性导致的。不过没有关系,query 已经满足要求。

    再次感谢你的分享!

请输入回帖内容 ...

推荐标签 标签

  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 385 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 98 关注
  • danl
    173 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 463 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 553 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    42 引用 • 130 回帖 • 249 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 645 关注
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 77 回帖
  • abitmean

    有点意思就行了

    34 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 1 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 273 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    554 引用 • 675 回帖
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • gRpc
    11 引用 • 9 回帖 • 97 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 13 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 544 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 52 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    142 引用 • 442 回帖 • 2 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 184 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    211 引用 • 358 回帖
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖 • 1 关注
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    434 引用 • 1238 回帖 • 594 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    298 引用 • 763 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    730 引用 • 1281 回帖 • 1 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    79 引用 • 396 回帖
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 1 关注