2013-03-26 59 views
1

有没有一种方法可以根据另一个表中的字段值来有条件地更改我内部联接的表?这是我走到这一步(但错误)指出:MySQL中的条件内部联接语句

SELECT 
    j.jobID, j.jobNumber, 
    CASE 
     WHEN j.idType = 'dealership' THEN d.dealershipName 
     WHEN j.idType = 'Group' THEN g.groupName 
     WHEN j.idType = 'Agency' then a.agencyName 
    END as dealershipName, 
    CASE 
     WHEN p.manualTimestamp != '0000-00-00 00:00:00' THEN UNIX_TIMESTAMP(p.manualTimestamp) 
     WHEN p.manualTimestamp = '0000-00-00 00:00:00' THEN p.timestamp 
    END as checkTS, 
    CONCAT_WS(' ', ui.fName, ui.lName) as salesRep 
FROM jobs j 
LEFT JOIN dealerships d ON j.dealershipID = d.dealershipID 
LEFT JOIN dealershipgroups g ON j.dealershipID = g.groupID 
LEFT JOIN agencies a ON j.dealershipID = a.agencyID 
INNER JOIN payments p ON j.jobID = p.jobID 
IF j.idType = 'dealership' THEN 
    INNER JOIN smdealershipjoins smdj ON j.dealershipID = smdj.dealership 
    INNER JOIN userinfo ui ON smdj.sm = ui.userID   
ELSEIF j.idType = 'Group' THEN 
    INNER JOIN smgroupjoins gj ON j.dealershipID = gj.groupID 
    INNER JOIN userinfo ui ON gj.sm = ui.userID 
ELSEIF j.idType = 'Agency' THEN 
    INNER JOIN smagencyjoins aj ON j.dealershipID = aj.agencyID 
    INNER JOIN userinfo ui on aj.sm = ui.userID 
END IF 

所以,有一个表(工种)有和idType(经销商,团体或机构)和一个clientId(称为dealershipID)。我需要做的是加入某个表(基于idType)来确定哪个销售经理“拥有”客户帐户。如果idType ='dealership',我需要加入smdealershipjoins,如果它是'Group'我需要加入smgroupjoins,并且'agency'需要加入smagencyjoins,以便我可以将该表加入userinfo以获得销售额经理的名字。

我也尝试过使用case语句来完成内部连接,但这也给了一个错误。

回答

6

左/外连接到三个选项中的每一个,并且您的选择中的条件将处理其余部分。

也许是这样的:

... 
LEFT JOIN smdealershipjoins smdj 
    ON j.dealershipID = smdj.dealership 
LEFT JOIN smgroupjoins gj 
    ON j.dealershipID = gj.groupID 
LEFT JOIN smagencyjoins aj 
    ON j.dealershipID = aj.agencyID 
LEFT JOIN userinfo ui 
    ON ui.userID = CASE 
     WHEN j.idType = 'dealership' THEN smdj.sm 
     WHEN j.idType = 'Group' THEN gj.sm 
     WHEN j.idType = 'Agency' then aj.sm 
    END 
+0

但我的UI表有哪些?我收到“非唯一表/别名:'ui'”的错误 – Brds 2013-03-26 17:56:04

+0

请勿多次加入userinfo表(并赋予它相同的别名)。你应该在连接中使用类似的CASE。如果你想组合一个sqlfiddle模式,我们可以测试我的建议。 – Alkini 2013-03-26 21:39:41