【问题标题】:MySQL LEFT JOIN a different table based on a field valueMySQL LEFT JOIN 基于字段值的不同表
【发布时间】:2026-01-18 09:05:02
【问题描述】:

我知道类似的问题已经提出过几次,但似乎这些都与基于特定字段值的字段值变化有关。我实际上想根据每条记录的字段值加入一个完全不同的表。

我认为这可以通过单个查询来实现,但由于连接表可能会更改每条记录,我不确定。

澄清一下,我有四张桌子;我试图在一个查询中加入其中三个。但是,根据每个记录字段中的值,第三个表可能是两个表之一。

我会想象它看起来像这样,但它不起作用。

SELECT crm_deal . * , crm_deal_step.sort_order, COALESCE( CONCAT_WS(' ',crm_lead.first_name, crm_lead.last_name),CONCAT_WS(' ',customer.firstname, customer.lastname) ) AS contact_full_name
FROM  `crm_deal`
IF( crm_deal.deal_for = 'lead', LEFT JOIN crm_lead ON crm_deal.deal_for_id = crm_lead.lead_id, LEFT JOIN customer ON crm_deal.deal_for_id = customer.customer_id)
LEFT JOIN crm_deal_step ON crm_deal.deal_step_id = crm_deal_step.deal_step_id

我接近了吗?有可能还是我需要做一个 php 循环并为每条记录运行第二个查询?

【问题讨论】:

    标签: mysql sql select if-statement join


    【解决方案1】:

    您不能在 select 语句中使用 if 语句。 但是你可以试试这个:

        SELECT crm_deal . * , crm_deal_step.sort_order, 
    CASE WHEN crm_lead.first_name is not null AND
              crm_lead.last_name is not null
              THEN crm_lead.first_name+ ' '+crm_lead.last_name
              ELSE customer.firstname +' '+ customer.lastname
              END as contact_full_name
        FROM  `crm_deal`
        LEFT JOIN crm_lead ON crm_deal.deal_for_id = crm_lead.lead_id AND crm_deal.deal_for = 'lead' 
        LEFT JOIN customer ON crm_deal.deal_for_id = customer.customer_id AND crm_deal.deal_for <> 'lead' 
        LEFT JOIN crm_deal_step ON crm_deal.deal_step_id = crm_deal_step.deal_step_id
    

    【讨论】:

    • 这适用于使用 COALESCE 函数中首先出现的任何表填充 contact_full_name 字段,但另一个保持空白。
    • 那是因为 CONCAT_WS(' ',crm_lead.first_name, crm_lead.last_name) 永远不会给你空值。所以 CONCAT_WS(' ',customer.firstname, customer.lastname) 永远不会显示。
    • 这确实让我找到了解决方案。有了这个添加,我现在可以在选择中添加一个 if 语句。像这样。选择 crm_deal 。 * , crm_deal_step.sort_order, IF(CONCAT_WS(' ',customer.firstname, customer.lastname) = "", CONCAT_WS(' ',crm_lead.first_name, crm_lead.last_name), CONCAT_WS(' ',customer.firstname, customer. lastname)) AS contact_full_name FROM crm_deal LEFT JOIN customer ON crm_deal.deal_for_id = customer.customer_id AND crm_deal.deal_for = 'customer' LEFT JOIN crm_lead ON crm_deal.deal_for_id = crm_lead.lead_id AND crm_deal.deal_for 'customer'跨度>
    • 左加入 crm_deal_step on crm_deal.deal_step_id = crm_deal_step.deal_step_id
    • 如果您想修改您的答案,我会选择它作为解决方案。感谢您的帮助!