如何使MySQL加入条件?

时间:2018-02-19 10:37:58

标签: conditional inner-join mysql-5.7

我使用MySQL 5.7并有三个表。我只是展示每个相关字段来解释我的问题。

_context.Wallets.Attach(model.wallet);

我想做以下事情:

TourHdr.id
TourHdr.paxnos

TourDet.id
TourDet.tourhdrid
TourDet.tourdate
TourDet.paxnos

DietAnal.ddtourid
DietAnal.ddtourtype

即。查询中与DietAnal的连接要么基于TourHdr信息,要么基于TourDet信息,具体取决于paxnos在TourHdr和TourDet中是否相等。

我已经阅读了Stack Overflow和MySQL论坛上的许多条件连接问题,但还没有真正设法让它发挥作用。我在联接中尝试了IF表达式,Case表达式和AND / OR,但我没有设法得到正确的结果。

要理解的主要事情是DietAnal中总有一组与TourHdr.id匹配的记录但偶尔会有当paxnos不同时直接连接到TourDet.id的记录。

1 个答案:

答案 0 :(得分:0)

我得到了以下工作:

    Select 'various' from TourDet
    Inner join TourHdr on TourDet.tourhdrid = TourHdr.id
    Inner join DietAnal on DietAnal.ddtourid = TourDet.id and DietAnal.ddtourtype = 'TourDet' 
OR
DietAnal.ddtourid = TourHdr.id and DietAnal.ddtourtype = 'TourHdr'

那是唯一一个没有给我任何语法错误的人,但是当DietAnal表中同时存在一组TourDet条目时,我得到了这些并且我也设置了TourHdr。

答案结果是在联接中还包括paxnos需要相同或不同的条件。这是我不理解的一点。我一直认为连接只能包含要连接的表中的字段,但它可以包含查询中可访问的任何字段。

所以我最后的询问是:

    Select 'various' from TourDet
    Inner join TourHdr on TourDet.tourhdrid = TourHdr.id
    Inner join DietAnal on DietAnal.ddtourid = TourDet.id and DietAnal.ddtourtype = 'TourDet' and TourHdr.paxnos != TourDet.paxnos
OR
DietAnal.ddtourid = TourHdr.id and DietAnal.ddtourtype = 'TourHdr' and TourHdr.paxnos = TourDet.paxnos

对于经验丰富的MySQL用户来说,这看起来似乎很简单,但我希望那些经验不足的人能够从我不得不花时间去工作中受益。