SQL 怎么排除有子项的列表?

本贴最后更新于 205 天前,其中的信息可能已经渤澥桑田

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

747827bad5c7b08977feac5ebf4c1013.png

  • 思源笔记

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

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

    23006 引用 • 92537 回帖
  • Q&A

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

    8445 引用 • 38464 回帖 • 154 关注
被采纳的回答
  • zxhd86 1
    select * from blocks 
    where
    id not in (select parent_id from blocks where type = 'l')
    and type = 'i'
    and subtype = 't'
    limit 10
    

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • zxhd86 1
    select * from blocks 
    where
    id not in (select parent_id from blocks where type = 'l')
    and type = 'i'
    and subtype = 't'
    limit 10
    
    1 回复
  • 有办法排除父任务已完成的子任务的吗?

    只查询红框里的未完成的任务:

    image.png

    基于这一段 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) [注:任务列表块的父块是上层任务列表项块] */
    
    1 回复
    1 操作
    JeffreyChen 在 2024-05-31 13:39:35 更新了该回帖
  • 这个需要用到递归,可能不是这么好理解:

    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
    
    1 回复
  • 这个只会查询到 6 :(我没专门学过 SQL ,靠你了 🙏 )

    image.png

    1 回复
  • zxhd86 1
    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
    
    3 回复
  • 没变化诶。

    隔一个小时再试又可以了 😳

    2 操作
    JeffreyChen 在 2024-05-31 15:18:58 更新了该回帖
    JeffreyChen 在 2024-05-31 13:47:40 更新了该回帖
  • 还需要排除一下 6 :

    image.png

    1 回复
  • 图片.png
    图片.png

    奇怪,在我这边是正常的

    2 回复
  • 我人傻了,一样的文档有不同的结果:

    image.png

  • 我重建索引之后就好了。估计是调整表格缩进的时候索引不对,也不知道怎么复现这个问题。

  • 我突然发现 queryBlocks 好像用不了这个

    是里面的双引号的问题,改成单引号就 OK 了。

    关联 Issue #11603 · siyuan-note/siyuan

    2 操作
    JeffreyChen 在 2024-05-31 17:37:58 更新了该回帖
    JeffreyChen 在 2024-05-31 17:17:00 更新了该回帖
  • @zxhd86 我脑子已经烧掉了,这个 SQL 能做吗:

    image.png

    我用下面这个 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) [注:任务列表块的父块是上层任务列表项块] */
    
    1 回复
    1 操作
    JeffreyChen 在 2024-05-31 20:47:37 更新了该回帖
  • 阿巴阿巴,没太看懂需求。

    1 回复
  • 这样能理解吗:

    image.png

    1 回复
  • zxhd86 1

    这确实写的出来,但是提醒一下,太多子查询很慢的:

    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
    
    
    1 回复
  • 性能确实差,目前一次查询要半秒,放到数据库模板列之后更撑不住。

    还有优化的方法吗?如果 SQL 没法优化的话,思源有办法通过什么方式优化吗?


    我给每个查询都加上了 and root_id = '20240402135122-f5usqip' ,效率提升 2/5 。

    1 回复
    2 操作
    JeffreyChen 在 2024-05-31 23:47:22 更新了该回帖
    JeffreyChen 在 2024-05-31 23:47:07 更新了该回帖
  • 思源的后端数据库要是丛 SQLite 切换到 DuckDB,估计性能就可以了。

请输入回帖内容 ...
JeffreyChen
思源是支持 Markdown 语法输入的块编辑器,不是 Markdown 文件编辑器; 思源笔记同步教程:ld246.com/article/1692089679062

推荐标签 标签

  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    210 引用 • 2036 回帖
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    6 引用 • 14 回帖
  • Q&A

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

    8444 引用 • 38459 回帖 • 154 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    343 引用 • 723 回帖
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    497 引用 • 1388 回帖 • 279 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 72 关注
  • 周末

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

    14 引用 • 297 回帖
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    77 引用 • 430 回帖 • 2 关注
  • Firefox

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

    8 引用 • 30 回帖 • 409 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖 • 1 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    55 引用 • 85 回帖
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    166 引用 • 595 回帖
  • abitmean

    有点意思就行了

    27 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖 • 5 关注
  • sts
    2 引用 • 2 回帖 • 197 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 75 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 59 关注
  • CloudFoundry

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

    5 引用 • 18 回帖 • 172 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    265 引用 • 666 回帖 • 1 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 63 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    93 引用 • 113 回帖 • 1 关注