0

我目前在一些遗留系统上工作,我遇到了一段这样写的 sql:

SELECT 
    cel.id,
    cel.campaign_id,
    cel.campaign_name,
    cel.campaign_message_type,
    cel.responsible_user_id,
    cel.responsible_user_full_name,
    cel.person_id,
    cel.email_template_id,
    cel.email_message_subject,
    cel.recipient_list_name,
    cel.first_name,
    cel.last_name,
    cel.email_address,
    b.message_content_html email_message_content_html,
    b.message_content_text email_message_content_text,
    b.course_presentation_id,
    cp.phone_mobile
FROM 
    campaigns_email_logs cel

    LEFT JOIN contacts_people cp ON 
        (cel.person_id = c.id),
        campaigns_email b
WHERE 
    cel.campaign_id = b.id and 
    cel.status = 'queued' and 
    cel.datetime_start < now() and 
    cel.datetime_end > now() and 
    b.paused = 'no' 
order by 
    {$campaignMessagesToSendOrdering};

请您解释一下 LEFT JOINcampaign_email 在做什么?是否在contacts_people 上进行交叉连接?为了让我快速理解这一点,任何人都可以在没有 ,campaigns_email 的情况下重写它。

我知道您的 from 子句中可以有多个表,但我从未见过这样的情况。

谢谢。

4

2 回答 2

3

这个查询有一个 LEFT JOIN一个 CROSS JOIN(使用“逗号语法”)。

相关部分在语义上等同于:

FROM campaigns_email_logs cel
LEFT JOIN contacts_people cp ON (cel.person_id = cp.id)
CROSS JOIN campaigns_email b

所以,既然我们已经将它建立为一个 CROSS JOIN,让我们考虑一下条件:

WHERE2 cel.campaign_id = b.id ..

繁荣。在那里,我们已经把这个 CROSS JOIN 变成了一个 INNER JOIN。重写:

FROM campaigns_email_logs cel
LEFT JOIN contacts_people cp ON (cel.person_id = cp.id)
JOIN campaigns_email b ON (cel.campaign_id = b.id)
于 2013-10-25T07:20:10.043 回答
0

campaigns_email没有左连接到任何东西。

在您的FROM子句中,您有一个JOINbetweencampaigns_email_logscontacts_people。然后你有一个笛卡尔积,它的结果是 join 和campaigns_email

于 2013-10-25T07:20:53.423 回答