mysql - 请解释 SQL 连接

标签 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 进行交叉连接?为了让我快速理解这一点,任何人都可以在没有 ,campaigns_email 的情况下重写它。

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

谢谢。

最佳答案

此查询有一个 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)

关于mysql - 请解释 SQL 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19583378/

相关文章:

php - 插入不同服务器上的 MySQL 数据库

c# - T-SQL 可以存储 ulong 的吗?

c# - 在 CodeBehind C# SQL 中访问 SCOPE_IDENTITY()

sql - 使用表中的列在 PostgreSQL 中创建 View

php - 如果字段不存在,则SQL插入行

SQL Server 事件探查器显示正在调用但实际上并未执行的存储过程

mysql - mysql中每行的日期差异

mysql - 正确排序 CONCAT 值 MYSQL

php - 如何绑定(bind)参数年份和日期类型?

mysql - 选择 3 个随机单词(记录)- 每个字母计数一个