自连接mysql复杂查询

自连接mysql复杂查询,mysql,sql,database,self-join,Mysql,Sql,Database,Self Join,我有一个名为call\u charges的表,其中包含以下数据。 我需要得到所有未支付的付款,其付款重试也是未支付的 i、 e具有交易\u出价非空且已支付0的行将返回id为6和10的记录。 但是id6具有付费重试(id12,具有retry\u id6和is\u paid1),因此结果中不应存在具有id6的行 我试过: SELECT `call_charges`.* FROM `call_charges` LEFT JOIN `call_charges` AS `retries_call_ch

我有一个名为
call\u charges
的表,其中包含以下数据。

我需要得到所有未支付的付款,其付款重试也是未支付的

i、 e具有
交易\u出价
非空且
已支付
0的行将返回id为
6和10的记录。
但是
id
6具有付费重试(
id
12,具有
retry\u id
6和
is\u paid
1),因此结果中不应存在具有
id
6的行

我试过:

SELECT `call_charges`.* FROM `call_charges` LEFT JOIN `call_charges` AS 
`retries_call_charges` ON `retries_call_charges`.`retry_id` = `call_charges`.`id`
WHERE `call_charges`.`is_paid` = 0 AND (`call_charges`.`transaction_bid` IS NOT NULL 
AND `call_charges`.`retry_id` IS NULL)
但是它返回id为
6和10的两行

提前谢谢。

给你:

SELECT c1.id
FROM call_charges c1
LEFT JOIN call_charges c2
ON c1.id = c2.retry_id AND c2.is_paid = 1
WHERE c1.transaction_bid IS NOT NULL
AND c1.is_paid = 0
AND c2.id IS NULL
AND c1.retry_id IS NULL
工作小提琴:


c2.id
可能为空,因为使用了
左连接。当
c1.id
不匹配
c2.retry\u id
时,
c2.id
将为空。

选择
call\u charges
*FROM
call\u charges
LEFT JOIN
call\u charges
AS
重试call\u charges
重试call\u charges
上运行此查询并查看您得到的结果,然后根据数据创建您的WHERE。嘿,您只想要第十个……是的,只想要第十个。它起作用了,请解释一下
c2.id is NUL的含义
id
是主键,对于任何记录都不为空。它不起作用,如果第12行为0,则它应该返回第6行和第10行,但只返回第10行。@shweta修复并更新了上面的答案(包括fiddle)。顺便说一下,你的情况可能需要也可能不需要最后一个条件。