You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 04:47:49