【问题标题】:MySQL Left Join producing null rowsMySQL Left Join 产生空行
【发布时间】:2015-06-18 16:18:17
【问题描述】:

我正在尝试使用下面的查询来过滤一个相当大的表并收集有关已更新数据的用户的数据(带有用于更新的用户 ID 的表是由触发器构建并每天清除)。因此,目标是以下列格式返回数据:

+--------------------------------------------------------------------------------+
| web_contacts_id   contact_id    franchise_id    last_transaction_date    email |
+--------------------------------------------------------------------------------+
|        1             23                1            1/1/15          bob@bob.bob|
|        2            null              null           null              null    |
|       ...           ...               ...            ...               ...     |
+--------------------------------------------------------------------------------+

这样,我们可以知道哪些用户已经更新,但还没有交易。

但是,当左侧查询的另一侧没有可匹配的内容时(即未找到最大的 last_transaction_date),查询将产生以下结果

+--------------------------------------------------------------------------------+
| web_contacts_id   contact_id    franchise_id    last_transaction_date    email |
+--------------------------------------------------------------------------------+
|        1             23                1            1/1/15          bob@bob.bob|
|       null          null              null           null              null    |
|       ...           ...               ...            ...               ...     |
+--------------------------------------------------------------------------------+

我不确定为什么左连接会将无法连接的行的所有值都设置为 null,尤其是因为 LEFT 表确实有这些用户的 web_contacts_id。这是我目前使用的查询。

SELECT wcl.web_contacts_id, wcl.contact_id, wcl.franchise_id, wcl.last_transaction_date, wc.email
FROM bl_updates bld
LEFT JOIN (
    SELECT wcl.contact_id, wcl.franchise_id, wcl.web_contacts_id, wcl2.last_transaction_date
    FROM web_contacts_location wcl
    INNER JOIN (
        SELECT wcl_inner.web_contacts_id, MAX(wcl_inner.last_transaction_date) as last_transaction_date
        FROM web_contacts_location as wcl_inner
        WHERE web_contacts_id IN (
            SELECT id FROM bl_updates
        )
        GROUP BY web_contacts_id
    ) wcl2 on wcl.web_contacts_id = wcl2.web_contacts_id AND wcl.last_transaction_date = wcl2.last_transaction_date
)wcl ON wcl.web_contacts_id = bld.id
LEFT JOIN web_contacts wc on wc.id = wcl.web_contacts_id

【问题讨论】:

    标签: mysql sql select left-join


    【解决方案1】:

    您选择的所有列都来自wclwc 表,因此当bld 中有一行没有匹配的wcl 行时,您将获得一行nulls.

    您可以选择bld.id 而不是wcl.web_contacts_id 以获取这些行中的至少一些内容:

    SELECT bld.id, wcl.contact_id, wcl.franchise_id, wcl.last_transaction_date, wc.email
    -- Here --^
    FROM bl_updates bld
    LEFT JOIN (
        SELECT wcl.contact_id, wcl.franchise_id, wcl.web_contacts_id, wcl2.last_transaction_date
        FROM web_contacts_location wcl
        INNER JOIN (
            SELECT wcl_inner.web_contacts_id, MAX(wcl_inner.last_transaction_date) as last_transaction_date
            FROM web_contacts_location as wcl_inner
            WHERE web_contacts_id IN (
                SELECT id FROM bl_updates
            )
            GROUP BY web_contacts_id
        ) wcl2 on wcl.web_contacts_id = wcl2.web_contacts_id AND wcl.last_transaction_date = wcl2.last_transaction_date
    )wcl ON wcl.web_contacts_id = bld.id
    LEFT JOIN web_contacts wc on wc.id = wcl.web_contacts_id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-27
      • 2021-03-22
      • 1970-01-01
      • 2020-09-19
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      相关资源
      最近更新 更多