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
运算符,以连接 id
和 biling_type
列。LEFT JOIN
表示第一个表 (t1
) 的所有记录都将包含在结果集中,即使在第二个表 (t2
) 中没有匹配项。
WHERE
子句将结果集过滤为仅包括符合第一个条件 (create_time > '2023-03-01' AND tranfer_type = 'PAYOUT' AND biling_type = 'PAYOUT_FEE_REVERSED'
) 且第二个表中的 id
为 NULL
的记录。这意味着我们只选择第二个条件不满足的记录,即在第二个表中没有匹配的记录。
另外一种写法:
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
过滤出不存在于第二个条件结果集中的记录。
这个查询使用了子查询,可能会对性能产生一定的影响。因此,具体实现应该根据实际情况选择最合适的方法。