我正在使用MySQL 5.7,并有三个表。我只显示每个领域的相关字段来解释我的问题。
TourHdr.id
TourHdr.paxnos
TourDet.id
TourDet.tourhdrid
TourDet.tourdate
TourDet.paxnos
DietAnal.ddtourid
DietAnal.ddtourtype
我想做以下操作:
Select 'various' from TourDet
Inner join TourHdr on TourDet.tourhdrid = TourHdr.id
Inner join DietAnal on DietAnal.ddtourid = TourHdr.id and DietAnal.ddtourtype = 'TourHdr' (IF TourHdr.paxnos = TourDet.paxnos)
OR
Inner join DietAnal on DietAnal.ddtourid = TourDet.id and DietAnal.ddtourtype = 'TourDet' (IF TourHdr.paxnos = TourDet.paxnos)
即。查询中的Dietanal加入基于Tourhdr Info或TourDet信息,具体取决于Paxnos是否在Tourhdr和Tourdet中相等。
我已经阅读了许多有条件的加入堆栈溢出和MySQL论坛上的问题,但还没有真正设法使其工作。我尝试过是否表达式,案例表达和/或在加入中,但没有设法获得正确的结果。
最重要的是,饮食中总是有一系列与Tourhdr.ID相匹配的记录,但偶尔有唱片直接连接到TourDet.ID。/div>
我已经得到以下操作:
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用户来说,这似乎很简单,但我希望其他经验较少的人将从我不得不花钱才能工作的时间中受益。