同一张表查询条件1的结果集在条件2的结果集不存在的记录

mysql都查询同一张表,条件不一样

条件1:
select * from merchant_billing_flow where create_time>’2023-03-01′ and tranfer_type=’PAYOUT’ AND biling_type=’PAYOUT_FEE_REVERSED’;

条件2:
select * from merchant_billing_flow where create_time>’2023-03-01′ and tranfer_type=’PAYOUT’ AND biling_type=’PAYOUT_FEE’;

现在一条SQL, 查询条件1的结果集在条件2的结果集不存在的记录

 

select count(1) from merchant_billing_flow where create_time>'2023-03-01' and tranfer_type='PAYOUT' AND biling_type='PAYOUT_FEE_REVERSED';



select count(1),sum(billing) from merchant_billing_flow a where create_time>'2023-02-01' and tranfer_type='PAYOUT' AND biling_type='PAYOUT_FEE_REVERSED' AND not  EXISTS (select 1 from merchant_billing_flow b  where b.order_id=a.order_id and  b.tranfer_type='PAYOUT' AND b.biling_type='PAYOUT_FEE' );



select biling_type,count(1) from merchant_billing_flow where  order_id in(select order_id from merchant_billing_flow where create_time>'2023-03-01' and tranfer_type='PAYOUT' AND biling_type='PAYOUT_FEE_REVERSED')
group by biling_type;

 

您可以使用 LEFT JOIN 来实现这个需求。首先,您可以使用一个常规的 SELECT 语句检索符合第一个条件的记录。然后,您可以使用 LEFT JOIN 将结果集与符合第二个条件的记录连接起来。最后,您可以过滤掉连接结果集中第二个条件的列有非空值的记录。

以下是实现这个需求的示例:

  SELECT count(1)
FROM merchant_billing_flow t1
LEFT JOIN merchant_billing_flow t2
  ON t1.order_id = t2.order_id 
    AND t2.biling_type = 'PAYOUT_FEE'
WHERE t1.create_time > '2023-01-01' 
  AND t1.tranfer_type = 'PAYOUT' 
  AND t1.biling_type = 'PAYOUT_FEE_REVERSED' 
  AND t2.order_id IS NULL;

在此查询中,我们在 id 列上将 merchant_billing_flow 表与自身连接。我们还在 ON 子句中使用了 AND 运算符,以连接 idbiling_type 列。LEFT JOIN 表示第一个表 (t1) 的所有记录都将包含在结果集中,即使在第二个表 (t2) 中没有匹配项。

WHERE 子句将结果集过滤为仅包括符合第一个条件 (create_time > '2023-03-01' AND tranfer_type = 'PAYOUT' AND biling_type = 'PAYOUT_FEE_REVERSED') 且第二个表中的 idNULL 的记录。这意味着我们只选择第二个条件不满足的记录,即在第二个表中没有匹配的记录。

 

另外一种写法:

SELECT *
FROM merchant_billing_flow
WHERE create_time > '2023-03-01'
  AND tranfer_type = 'PAYOUT'
  AND biling_type = 'PAYOUT_FEE_REVERSED'
  AND id NOT IN (
    SELECT id
    FROM merchant_billing_flow
    WHERE create_time > '2023-03-01'
      AND tranfer_type = 'PAYOUT'
      AND biling_type = 'PAYOUT_FEE'
  );

这个查询首先检索符合第一个条件的记录,然后使用子查询检索符合第二个条件的记录的 id 列,最后使用 NOT IN 过滤出不存在于第二个条件结果集中的记录。

这个查询使用了子查询,可能会对性能产生一定的影响。因此,具体实现应该根据实际情况选择最合适的方法。

发表评论

邮箱地址不会被公开。