怎么写 SQL 能查询红色(无子项)排除蓝色(有子项)?

怎么写 SQL 能查询红色(无子项)排除蓝色(有子项)?

思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。
融合块、大纲和双向链接,重构你的思维。
提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。
有办法排除父任务已完成的子任务的吗?
只查询红框里的未完成的任务:

基于这一段 SQL 改:
SELECT * FROM blocks WHERE
root_id = '20240402135122-f5usqip'
AND type = 'i'
AND markdown LIKE '* [ ]%'
AND id not in (SELECT parent_id FROM blocks WHERE type = 'l' AND markdown LIKE '%* [ ]%')
/* 该块[任务列表项块]的id 不是(未完成的任务列表块的父块[任务列表项块]id) [注:任务列表块的父块是上层任务列表项块] */
这个需要用到递归,可能不是这么好理解:
WITH RECURSIVE finish_tree AS (
-- 非递归部分:选择根节点
SELECT id, parent_id
FROM blocks
WHERE
markdown like "* [x]%"
UNION ALL
-- 递归部分:选择所有子节点
SELECT fi.id, fi.parent_id
FROM blocks as fi
INNER JOIN finish_tree as ft ON fi.parent_id = ft.id
)
select * from blocks
where
id not in (select id from finish_tree)
and root_id = '20240522181405-mdiudfl'
and type = 'i'
and subtype = 't'
limit 10
WITH RECURSIVE finish_tree AS (
-- 非递归部分:选择根分类
SELECT id, parent_id
FROM blocks
WHERE
markdown like "* [x]%"
and type = 'i'
and subtype = 't'
UNION ALL
-- 递归部分:选择所有子分类
SELECT fi.id, fi.parent_id
FROM blocks as fi
INNER JOIN finish_tree as ft ON fi.parent_id = ft.id
)
select * from blocks
where
id not in (select id from finish_tree)
and root_id = '20240522181405-mdiudfl'
and type = 'i'
and subtype = 't'
limit 10
没变化诶。
隔一个小时再试又可以了 😳
@zxhd86 我脑子已经烧掉了,这个 SQL 能做吗:

我用下面这个 SQL 会查询到 5 ,但查不到 6 :
(只能查询到 5 ,6 因为带有未完成的间接子任务所以被忽略了)
/* 排除父任务已完成的所有子任务id */
WITH RECURSIVE finish_tree AS (
-- 非递归部分:选择根分类
SELECT id, parent_id
FROM blocks
WHERE
markdown like '* [x]%'
and type = 'i'
and subtype = 't'
UNION ALL
-- 递归部分:选择所有子分类
SELECT fi.id, fi.parent_id
FROM blocks as fi
INNER JOIN finish_tree as ft ON fi.parent_id = ft.id
)
SELECT * FROM blocks WHERE
root_id = '20240402135122-f5usqip'
AND type = 'i'
AND markdown LIKE '* [ ]%'
AND id not in (select id from finish_tree)
AND id not in (SELECT parent_id FROM blocks WHERE type = 'l' AND markdown LIKE '%* [ ]%')
/* 该块[任务列表项块]的id 不是(未完成的任务列表块的父块[任务列表项块]id) [注:任务列表块的父块是上层任务列表项块] */
这确实写的出来,但是提醒一下,太多子查询很慢的:
with RECURSIVE finish_tree AS (
-- 非递归部分:选择根分类
SELECT id, parent_id
FROM blocks
WHERE
markdown like "* [x]%"
and type = 'i'
and subtype = 't'
UNION ALL
-- 递归部分:选择所有子分类
SELECT fi.id, fi.parent_id
FROM blocks as fi
INNER JOIN finish_tree as ft ON fi.parent_id = ft.id
)
,un_finish_parent AS (
SELECT id, parent_id
FROM blocks
WHERE
type = 'l'
and id in (
select parent_id from blocks
where
markdown like "* [ ]%"
and type = 'i'
and subtype = 't'
)
)
select * from blocks
where
id not in (select parent_id from un_finish_parent )
and id not in (select id from finish_tree)
and root_id = '20240522181405-mdiudfl'
and type = 'i'
and subtype = 't'
limit 10
性能确实差,目前一次查询要半秒,放到数据库模板列之后更撑不住。
还有优化的方法吗?如果 SQL 没法优化的话,思源有办法通过什么方式优化吗?
我给每个查询都加上了 and root_id = '20240402135122-f5usqip' ,效率提升 2/5 。
* [ ] 需要更新为 - [ ]、* [x] 需要更新为 - [x],工作空间需要重建索引
Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。
Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。
etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。
IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。
JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA。
互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。
Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。
Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。
Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。
LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。
Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。
知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。
iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。
Quicker 您的指尖工具箱!操作更少,收获更多!
Thank God It's Friday! 感谢老天,总算到星期五啦!
房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。
你比 99% 的人都优秀么?
Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。
心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。
Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。
大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。
NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。
Postman 是一款简单好用的 HTTP API 调试工具。