请解释SQL连接

时间:2013-10-25 07:12:14

标签: mysql sql

我目前正在研究一些遗留系统,我遇到了一个像这样编写的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 JOIN campaigns_email正在做什么?它是否在contacts_people上进行交叉连接?为了让我能够快速理解这一点,任何人都可以在没有,campaign_email的情况下重写它。

我知道你的from子句中可以有多个表,但我从来没有见过这样的表。

感谢。

2 个答案:

答案 0 :(得分:3)

此查询有一个LEFT JOIN 一个CROSS JOIN(使用"comma syntax")。

相关部分在语义上与:

相同
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)

答案 1 :(得分:0)

campaigns_email没有留下任何东西。

FROM条款中,JOINcampaigns_email_logs之间有contacts_people。然后你有一个带有此连接结果的cartessian产品和campaigns_email