我目前正在研究一些遗留系统,我遇到了一个像这样编写的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子句中可以有多个表,但我从来没有见过这样的表。
感谢。
答案 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
条款中,JOIN
和campaigns_email_logs
之间有contacts_people
。然后你有一个带有此连接结果的cartessian产品和campaigns_email
。