【分享】利用 SQL 以两种方法实现任务管理

前提

本文分享的 SQL 代码推荐配合以下规定格式(无序列表 + 任务)使用:

  • 任务分类(自定义,最好使用块引用,方便使用反链汇总)

    • 具体任务 1
    • 具体任务 2
    • ...

方法 1——利用嵌入块

实现代码

1.已完成任务

SELECT * FROM blocks WHERE (id in (SELECT parent_id FROM blocks WHERE type='l' AND markdown LIKE '%[x]%'  AND subtype='t' )) ORDER BY updated DESC

2.待办任务

SELECT * FROM blocks WHERE (id in (SELECT parent_id FROM blocks WHERE type='l' AND markdown LIKE '%[ ]%'  AND subtype='t' )) ORDER BY updated DESC

实现效果

image.png

特点

  • 优点:
    1. 可以同时显示任务项和所属分类。
    2. 即使未按照规定格式记录任务,也可通过任务记录所在的文档名称显示任务项的从属关系。
    3. 所有任务都能够直观显示。
  • 缺点:
    1. 无法直观显示任务的创建时间和更新(完成)时间。
    2. 并列的任务(同一个分类下多个子任务)如果只有部分完成则无法完全区分开,“已完成任务”和“待完成任务”中都将显示。
    3. 所有任务都显示出来占据篇幅大,可以通过 LIMIT 限制。

方法 2——利用 Query 挂件

实现代码

1.已完成任务

SELECT
    CASE
        WHEN b.fcontent == '' 
        THEN '==**未分类**=='
        ELSE b.fcontent 
    END AS __1____pre__任务分类,
    '['||
        CASE
            WHEN length(replace(b.content,b.fcontent,''))>16
            THEN substr(replace(b.content,b.fcontent,''),1,16)||'...'
            ELSE replace(b.content,b.fcontent,'')
        END||'](siyuan://blocks/'||b.id||')' AS __2____pre__已完成任务列表,
    b.created AS __3____datetime__创建时间,b.updated AS __4____datetime__更新时间,
    '['||b.hpath||'](siyuan://blocks/'||b.id||')' AS __5____pre__任务路径
FROM
    blocks AS b
WHERE
    ( id in
        (SELECT parent_id FROM blocks
        WHERE
        (type = 'l'
        AND
            markdown LIKE '%[x]%'
        AND
            subtype = 't'
        AND
            hpath NOT LIKE '%从这里开始%'
        )
        )
    )
ORDER BY
    b.updated DESC
LIMIT 20

2.待办任务

SELECT
    CASE
        WHEN b.fcontent == '' 
        THEN '==**未分类**=='
        ELSE b.fcontent 
    END AS __1____pre__任务分类,
    '['||
        (CASE
            WHEN length(replace(b.content,b.fcontent,''))>16
            THEN substr(replace(b.content,b.fcontent,''),1,16)||'...'
            ELSE replace(b.content,b.fcontent,'')
        END)||'](siyuan://blocks/'||b.id||')' AS __2____pre__待完成任务列表,
    b.created AS __3____datetime__创建时间,b.updated AS __4____datetime__更新时间,
    '['||b.hpath||'](siyuan://blocks/'||b.id||')' AS __5____pre__任务路径
FROM
    blocks AS b
WHERE
    ( id in
        (SELECT parent_id FROM blocks
        WHERE
        (type = 'l'
        AND
            markdown LIKE '%[ ]%'
        AND
            subtype = 't'
        AND
            hpath NOT LIKE '%从这里开始%'
        )
        )
    )
ORDER BY
    b.updated DESC
LIMIT 20

实现效果

image.png

image.png

特点

  • 优点:
    1. 显示效果更直观,包括任务分类、任务项、创建时间、更新(完成)时间、任务记录的位置。
    2. 对于任务项字数比较多的问题,为避免列宽过大,仅显示前 16 个字符。
    3. 占据篇幅更小。
  • 缺点:
    1. 需要严格按照规定格式记录任务,否则显示效果不佳(如上图标注)。
    2. 并列的任务(同一个分类下多个子任务)在列表中只会显示第一个任务的文字,要查看未完成/已完成的任务需要通过悬浮窗查看。

总结

  • 以上方法参考了其他用户的帖子,感谢。
  • 方法 1 和方法 2 各有优缺点,目前还不完美,大家根据需要选用。
  • 本文所使用的任务记录方法不限制记录位置,可以随时随地记录,推荐在 daily note 中记录。任务分类(块引用)放在无序列表中,方便后期利用反链整理汇总。

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • foolishman83 1 评论

    说实话,思源笔记对于任务列表的特性开发的不够,和 logseq 相比有一定差距,在待办事务管理上还有完善空间。比如任务列表的完成时间没有专有字段,只能通过更新时间来勉强匹配,比如设定将来特定时间的待办任务存在困难等等,希望在以后的版本中可以借鉴其他笔记软件的长处,虽然不至于要求 all in one,但基本的待办管理和事务笔记能够较好地结合,思源笔记的应用场景将会更大些。

    1 回复
    logseq 本身出来的时候就是参考了其他软件的任务管理功能,思源大概率是不会往这方面去做的
    ciwoyipang
  • 其他回帖
  • forwardlee

    很强,效果也不错,但是还是没怎么看懂,可能我太弱了

    1 回复
  • wonder1893
    订阅者

    之前我也追求这个。后面妥协了,直接 iframe 滴答清单

  • juyuning
    支持者 订阅者 作者

    对的,现在的任务场景没有单独作为一个功能点划分出来,所以没有其特有的功能。

  • 查看全部回帖