MYSQL 相同列的基本条件聚合

Posted

技术标签:

【中文标题】MYSQL 相同列的基本条件聚合【英文标题】:MYSQL basic conditional aggregation for same Columns 【发布时间】:2021-04-17 17:44:25 【问题描述】:

我有以下问题,我不知道我该如何解决。

我需要根据两个条件+相同属性进行过滤

获取事件为“paymentFailed”且事件不是“paymentSuccess”的用户

基本上我需要为每个用户过滤所有“失败的付款”,但条件意味着同一用户不能存在 paymentSuccess。

如果用户存在 paymentSuccess,结果应该为空。

id  name    event             transaction_number    
2   John    paymentFailed         002   
3   John    paymentInProcess      003   
4   John    paymentStucked        004   
5   John    paymentSuccess        005   
6   Jane    paymentFailed         006   
7   Jane    paymentSuccess        007   
8   Reese   paymentFailed         008   
9   Reese   paymentFailed         009   
10  Reese   otherPayment          010   

类似这样的事情(当 paymentSuccess 不存在时)

SELECT * FROM USERS where event != "paymentSuccess" AND event = "paymentFailed"

结果:

id  name    event             transaction_number    
8   Reese   paymentFailed         008   

并且(当 paymentSuccess 存在时)

SELECT * FROM USERS where event = "paymentSuccess" AND event = "paymentFailed"

结果:

id  name    event             transaction_number    
------------------------ Empty table -----------------------

【问题讨论】:

【参考方案1】:

使用NOT EXISTS:

SELECT u1.* 
FROM USERS u1 
WHERE u1.event = 'paymentFailed'
  AND NOT EXISTS (SELECT 1 FROM USERS u2 WHERE u2.name = u1.name AND u2.event = 'paymentSuccess')

【讨论】:

以上是关于MYSQL 相同列的基本条件聚合的主要内容,如果未能解决你的问题,请参考以下文章

SQL学习笔记 ----Mysql数据库的条件查询

聚合后如何有条件地对来自不同列的值求和?

mysql的一些基本常识

mysql基本数据类型和约束条件

MySQL 聚合函数MySQL对GROUP BY的处理

带你玩转JavaWeb开发之六-mysql基本语法详解及实例