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

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

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

747827bad5c7b08977feac5ebf4c1013.png

  • 思源笔记

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

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

    28443 引用 • 119762 回帖
  • Q&A

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

    11152 引用 • 50647 回帖 • 52 关注

相关帖子

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

    还有优化的方法吗?如果 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,估计性能就可以了。

  • * [ ] 需要更新为 - [ ]* [x] 需要更新为 - [x],工作空间需要重建索引

    关联 Issue #14680 · siyuan-note/siyuan

请输入回帖内容 ...
JeffreyChen
目前作为思源笔记的半个客服、测试、开发、评审,在爱发电接受捐赠:https://afdian.com/a/JeffreyChen

推荐标签 标签

  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 56 关注
  • Anytype
    3 引用 • 31 回帖 • 58 关注
  • Access
    1 引用 • 3 回帖 • 14 关注
  • 安全

    安全永远都不是一个小问题。

    202 引用 • 818 回帖
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    140 引用 • 407 回帖
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 144 回帖
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 668 关注
  • 数据库

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

    348 引用 • 765 回帖 • 2 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    119 引用 • 54 回帖
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    20 引用 • 37 回帖 • 577 关注
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 18 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 660 关注
  • 资讯

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

    56 引用 • 85 回帖
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    39 引用 • 170 回帖
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 98 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    61 引用 • 29 回帖 • 14 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    92 引用 • 752 回帖
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 1 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 516 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4602 回帖 • 731 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    293 引用 • 4496 回帖 • 688 关注
  • Notion

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

    10 引用 • 80 回帖 • 1 关注
  • 印象笔记
    3 引用 • 21 回帖 • 2 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 623 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    960 引用 • 946 回帖 • 1 关注
  • FreeMarker

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

    23 引用 • 20 回帖 • 475 关注