Mysql 选择这个或那个,但不要同时选择两者

Mysql 选择这个或那个,但不要同时选择两者,mysql,subquery,Mysql,Subquery,我有一个非常复杂的问题,让我的大脑融化 SELECT abunchOfStuff, r.xyz as netsell FROM normalmtm n JOIN mtmprogram m ON ( m.mtmprogram = n.loanprogram AND m.investor = 'Xyzzy' ) JOIN rates as r on ( r.term >= '2012-01-01' AND r.investor = m.investor AN

我有一个非常复杂的问题,让我的大脑融化

SELECT abunchOfStuff, r.xyz as netsell
FROM normalmtm n
JOIN mtmprogram m ON (
   m.mtmprogram = n.loanprogram
   AND m.investor = 'Xyzzy'
)
JOIN rates as r on (
    r.term >= '2012-01-01'
    AND r.investor = m.investor
    AND r.rate = n.rate
    AND r.program = m.basenormal
    AND r.clientcode = n.clientcode
)
LEFT OUTER JOIN mtmadjustments as ad ON (
    ad.loannumber = n.loannumber
    AND ad.investor = m.investor
)
WHERE n.loannumber = '12345678'
AND n.clientcode = 10
ORDER BY netsell DESC LIMIT 1
这是从它们中选择最大的netsell。现在,我不能完全理解的棘手部分是,rates表可能与n.clientcode匹配,也可能与n.clientcode不匹配。如果不匹配,我想使用clientcode 0,它本质上是一个通配符

现在我正在执行clientcode特定的查询,如果它没有返回任何内容,我将使用clientcode=0再次执行此查询。。。看来我可以把这两件事结合起来

我查看了EXISTS或notexists子查询,但我不知道如何在这个示例中使用它,我甚至不确定它是否合适

感谢您的帮助

IFNULL()应用于连接中的clientcode应该可以做到这一点

 AND r.clientcode = IFNULL(0, n.clientcode)
编辑:也许我没有完全理解你的问题。。。当它们不匹配时,您说您想要零,所以最初我建议在字段为null时使用一个选项,这样您就可以得到零来匹配r.clientcode。IFNULL在第二个值为null时输出第一个值,或者在第二个值不为null时输出第二个值,仅此而已

但是,如果你需要做1。)检查它们是否匹配,2。)如果匹配,加入,3。)如果不匹配,加入一个零值。。。您可能需要一个子查询

 AND r.clientcode = ( IFNULL(0, select nn.clientcode FROM normalmtm nn where r.clientcode = nn.clientcode and nn.clientcode=n.clientcode) )

诸如此类,也许…

因此,如果没有该客户代码的利率记录,请使用该投资者的利率、利率和计划以及客户代码0?似乎您的标题具有误导性。您没有选择其中一个,而是将
r.clientcode
与一个值或另一个值进行比较,对吗?对不起,我希望n.clientcode的费率记录为10,除非没有匹配项,否则我希望它与n.clientcode=0匹配。是。。。我想这会管用的。很不错的!我不知道为什么我不想使用IFNULL,我在很多其他情况下使用它,当我需要返回零而不是NULL时。
SELECT abunchOfStuff, ISNULL(r.xyz, r2.xyz) as netsell
FROM normalmtm n
JOIN mtmprogram m ON (
   m.mtmprogram = n.loanprogram
   AND m.investor = 'Xyzzy'
)
LEFT OUTER JOIN rates as r on (
    r.term >= '2012-01-01'
    AND r.investor = m.investor
    AND r.rate = n.rate
    AND r.program = m.basenormal
    AND r.clientcode = n.clientcode
)
LEFT OUTER JOIN rates as r2 on (
    r2.term >= '2012-01-01'
    AND r2.investor = m.investor
    AND r2.rate = n.rate
    AND r2.program = m.basenormal
    AND r2.clientcode = 0
)
LEFT OUTER JOIN mtmadjustments as ad ON (
    ad.loannumber = n.loannumber
    AND ad.investor = m.investor
)
WHERE n.loannumber = '12345678'
AND n.clientcode = 10
ORDER BY netsell DESC LIMIT 1