MySQL通过第一个表中的2列ID连接3个表

MySQL通过第一个表中的2列ID连接3个表,mysql,Mysql,我有三张桌子。。。联系人、出站操作员、数字操作员。 联系人表包含出站操作员和数字操作员生成的所有联系人。 因此,我将在“联系人”中列出这些列: 在第二个表中,我有所有出站运算符,因此该表如下所示: uid, out_bound_operator_full_name id, name, surname, outbound_operator_full_name (if this was generated by a outbound operator), digital_operator_full

我有三张桌子。。。联系人、出站操作员、数字操作员。 联系人表包含出站操作员和数字操作员生成的所有联系人。 因此,我将在“联系人”中列出这些列:

在第二个表中,我有所有出站运算符,因此该表如下所示:

uid, out_bound_operator_full_name
id, name, surname, outbound_operator_full_name (if this was generated by a outbound operator), digital_operator_full_name (if this was generated by a outbound operator).
第三个表与第二个表相同,但有以下列:

uid, digital_operator_full_name
我想得到这样的东西:

uid, out_bound_operator_full_name
id, name, surname, outbound_operator_full_name (if this was generated by a outbound operator), digital_operator_full_name (if this was generated by a outbound operator).
我必须在contacts表中指定至少两个联系人中的一个

(id_outbound_operator/id_digital_operator) is not null
我试过这个

SELECT CONTATTI.id, CONTATTI.nome_azienda, CONTATTI.telefono, CONTATTI.stato, CONTATTI.id_outbound, CONTATTI.id_digital_marketing_op, CONTATTI.blacklisted, OUTBOUND_INT_login.uid, OUTBOUND_INT_login.nome_completo, MARKETING_DIGITAL_login.uid, MARKETING_DIGITAL_login.nome_completo    
            FROM CONTATTI 
            JOIN OUTBOUND_INT_login 
            ON CONTATTI.id_outbound = OUTBOUND_INT_login.uid 
            JOIN MARKETING_DIGITAL_login
            ON CONTATTI.id_digital_marketing_op = MARKETING_DIGITAL_login.uid 

但是它不能正常工作

您可以按如下方式连接这三个表。您希望
左联接
,以便不会从结果集中删除不能同时与
出站(outbound)运算符
数字(digital)运算符
联接的
联系人
记录

select 
    c.id, 
    c.name, 
    c.surname, 
    op.outbound_operator_full_name,
    do.digital_operator_full_name
from contact c
left join outbound_operator op on c.id_outbound_operator = op.uid
left join digital_operator do on c.id_digital_operator = do.uid
正如Uuerdo所评论的,如果您想要一个具有
出站操作员\u全名
数字操作员\u全名
的唯一列,那么:

select 
    c.id, 
    c.name, 
    c.surname, 
    coalesce(op.outbound_operator_full_name, do.digital_operator_full_name) operator_full_name
from contact c
left join outbound_operator op on c.id_outbound_operator = op.uid
left join digital_operator do on c.id_digital_operator = do.uid

这种方法的优点是,它需要对联系人进行一次扫描,而使用
UNION(ALL)
时需要进行两次扫描。您应该使用一个
UNION
查询,这些查询与其他每个表连接

SELECT c.id, c.name, c.surname, o.outbound_operator_full_name
FROM CONTATTI AS c
JOIN OUTBOUND_INT_login AS o ON c.id = o.uid

UNION ALL

SELECT c.id, c.name, c.surname, m.digital_operator_full_name
FROM CONTATTI AS c
JOIN MARKETING_DIGITAL_login AS m ON c.id = m.uid

您需要分别与每个表联接,然后将它们与
联合
“它不能正常工作”结合起来,这对我们没有帮助。怎么不起作用?酒吧招待解决了这个问题。我以前写过工会,但可能犯了其他错误。现在它可以工作了,谢谢…如果OP需要相同结果字段中的名称:
IFNULL(OP.outbound\u operator\u full\u name,do.digital\u operator\u full\u name)作为operator\u full\u name
@uuerdo:good point,我相应地更新了我的答案。。。谢谢我在第一次使用union,但可能我犯了一些其他错误。现在它起作用了。谢谢你,伙计