如何执行一个mysql连接查询,从2个表中获取匹配的值,然后过滤第三个表中不存在的值?

如何执行一个mysql连接查询,从2个表中获取匹配的值,然后过滤第三个表中不存在的值?,mysql,sql,database,Mysql,Sql,Database,我有三个表格申请人,索赔,许可申请人和索赔具有一对多映射索赔和许可具有一对一映射。因此,申请人和许可具有一对多映射 申请人.id映射到索赔。申请人\u id。申请人.id和索赔.id都映射到许可证。申请人id和许可证。索赔id 我正在尝试执行与这3个表的连接,其中我希望获取与申请人相关的所有索赔,但希望筛选出已经存在于许可证中的索赔。这样我就只能拿到属于申请人的未结清的索赔 我可以使用此结果集返回端点的未清理索赔列表,并且当此结果集返回0行时(意味着索赔表中申请人的所有索赔也存在于清除表中),我

我有三个表格
申请人
索赔
许可
<代码>申请人和
索赔
具有一对多映射<代码>索赔和
许可
具有一对一映射。因此,
申请人
许可
具有一对多映射

申请人.id
映射到
索赔。申请人\u id
申请人.id
索赔.id
都映射到
许可证。申请人id
许可证。索赔id

我正在尝试执行与这3个表的连接,其中我希望获取与申请人相关的所有索赔,但希望筛选出已经存在于许可证中的索赔。这样我就只能拿到属于申请人的未结清的索赔

我可以使用此结果集返回端点的未清理索赔列表,并且当此结果集返回0行时(意味着
索赔
表中申请人的所有索赔也存在于
清除
表中),我需要更新
申请人
表中该申请人的列

我试过这样的方法:

Select claims.id from claims 
   inner join applicants on applicants.id = claims.applicant_id inner join 
   clearances on (clearances.applicant_id != applicants.id AND 
   clearances.claim_id != claims.id) where applicants.id = ?;
但这并没有输出期望的结果。我尝试使用NOT EXISTS,但无法使用它构造语法正确的查询

在此方面的任何帮助都将不胜感激

SELECT claims.id 
FROM claims 
INNER JOIN applicants ON applicants.id = claims.applicant_id 
LEFT JOIN clearances ON clearances.applicant_id = applicants.id 
                    AND clearances.claim_id = claims.id 
WHERE clearances.id IS NULL;


在表格格式中提供一些示例数据和所需输出。申请人id和索赔.id都映射到许可证。申请人id和许可证。索赔id。这是错误的。同一许可可能直接或通过索赔针对不同的申请人。@Akina我理解这一点。整个设计很糟糕。但我们不能更改客户端提供的模式中的任何内容。这就是斗争。你必须做出决定。您可以将其中一个关系链声明为次要关系链(什么?)并仅使用主关系链,或者同时使用这两个关系链并准备在存在完整性问题时清空输出。非常感谢!所以,诀窍是找到许可行,而该行在授予申请人id和索赔id权利的地方不存在?这就是为什么我们要通过permissions.id=null,还是我理解错了。可以用一点解释:)另外,如果我想稍微调整模式(需要说服我的团队)以获得更好的设计,那么在“claims”表中维护一个表示其许可状态的额外列会是更好的选择吗?这样我们就可以从索赔表本身中筛选未清理的索赔,不是吗?再次感谢您的帮助:)所以诀窍是在授予申请人id和索赔id权利的地方找到不存在的许可行?绝对正确。使用的等价物不存在(并且可以更快)。在“索赔”表中维护一个表示其清关状态的附加列是更好的选择吗?您已经过度定义了数据-您想加剧这种情况吗?那是你的选择。。。此外,我会考虑删除所有的
许可
,并将特定于许可流程的列移到
申请人
-我个人并不害怕稀疏的表格。非常感谢您再次回复!!:)
SELECT claims.id 
FROM claims 
INNER JOIN applicants ON applicants.id = claims.applicant_id 
WHERE NOT EXISTS ( SELECT NULL
                   FROM clearances 
                   WHERE clearances.applicant_id = applicants.id 
                     AND clearances.claim_id = claims.id );