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,但可能我犯了一些其他错误。现在它起作用了。谢谢你,伙计