如何在SQL中从事件型表获取快照视图?以及如何在MariaDB中筛选未完成状态的订单?
在MariaDB中提取未达到"completed"状态的订单列表
针对你的场景——要找出从来没有过"completed"状态记录的订单,这几个方法都能解决,而且在MariaDB里表现都不错:
方法1:NOT EXISTS(逻辑最直白)
直接检查每个订单ID是否不存在对应的completed记录,逻辑清晰,容易维护:
SELECT DISTINCT o.order_id FROM orders o WHERE NOT EXISTS ( SELECT 1 FROM orders o2 WHERE o2.order_id = o.order_id AND o2.state = 'completed' );
加DISTINCT是因为原表一个订单有多个事件记录,避免重复返回同一个order_id。
方法2:LEFT JOIN + IS NULL
和上面的思路类似,用左连接匹配completed记录,然后筛选没有匹配上的订单:
SELECT DISTINCT o.order_id FROM orders o LEFT JOIN orders o2 ON o.order_id = o2.order_id AND o2.state = 'completed' WHERE o2.order_id IS NULL;
性能和NOT EXISTS在MariaDB里差不多,看个人习惯选择即可。
方法3:分组聚合过滤
通过分组统计每个订单的completed状态次数,次数为0的就是从未完成的订单:
SELECT order_id FROM orders GROUP BY order_id HAVING SUM(CASE WHEN state = 'completed' THEN 1 ELSE 0 END) = 0;
这种方法用聚合函数做统计,也很直观,而且不需要DISTINCT,因为已经按order_id分组了。
用你给的示例数据测试的话,这三个方法都会返回order_id 3和4,完全符合预期。
内容的提问来源于stack exchange,提问作者Daniel F.
相关产品推荐
相关产品推荐

