【问题标题】:Please explain the SQL join [closed]请解释 SQL 连接 [关闭]
【发布时间】:2013-11-04 04:33:56
【问题描述】:

我目前正在处理一些遗留系统,我遇到了一段这样写的 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 子句中可以有多个表,但我从未见过这样的情况。

谢谢。

【问题讨论】:

  • 这里没有人会为你做你的工作,这里的人会帮你找到问题的解决方案,你试图解决。在寻求帮助之前至少检查文档Join Doku MySql
  • @winner_joiner 他在哪里要求你为他工作?
  • any one please rewrite it without the ,campaigns_email. - 在没有连接的情况下重写查询仅意味着从查询中删除它:, campaigns_email b
  • @jerdiggity 对我来说是“请您解释一下 LEFT JOIN ... 正在做什么?”和“......任何人都可以重写它......”,似乎是不阅读文档并让某人完成工作的简单方法,但这只是我的意见。也许我理解错了,我的错。

标签: mysql sql


【解决方案1】:

这个查询有一个左连接和一个交叉连接(使用"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)

【讨论】:

  • 谢谢大家的帮助。难以置信的反应。我认为这可能是一个交叉连接——我从来没有见过这样的做法。对不起,错字“c.id”应该是“cp.id”。我不得不让它有点可读性,忘记更新了。
【解决方案2】:

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

在您的FROM 子句中,您在campaigns_email_logs 和contacts_people 之间有一个JOIN。然后你有一个笛卡尔积,这个连接的结果和campaigns_email。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 2014-09-24
    • 2012-07-11
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多