Mito与SXQL中如何通过select-dao实现带过滤条件的行数统计
实现方案
方案1:直接使用count-dao传入过滤条件(推荐)
count-dao本身支持接收除select之外的所有SxQL条件子句(包括where、group by、having等),你只需要把原来写在select-dao里的过滤条件直接传给count-dao即可,示例代码:
;; 直接返回匹配的行数(整数类型) (mito:count-dao 'loan (sxql:where (:< :due-date (local-time:now))))
这个方案性能最优,和原生SQL统计行数的效率完全一致,适合绝大多数场景。
方案2:手动构造统计SQL(适用于已有复杂select结构的场景)
如果你已经写了包含自定义select字段、join关联等复杂查询逻辑,不想拆分条件,可以手动构造带count的SxQL语句,通过mito:retrieve-by-sql执行获取结果:
(getf (first (mito:retrieve-by-sql (sxql:select ((:count :*)) (sxql:from 'loan) (sxql:where (:< :due-date (local-time:now)))))) :count)
如果你的查询包含join、group by等逻辑,只需要把对应子句按SxQL语法加在上面的语句里即可。
补充说明
count-dao不支持接收select子句是框架设计如此:它本身已经封装了SELECT COUNT(*) FROM [表名]的基础结构,再传入自定义select子句会产生语法冲突,所以仅支持传入过滤、分组、排序类的子句。
内容的提问来源于stack exchange,提问作者Ehvince
相关产品推荐
相关产品推荐

