gpt4 book ai didi

MySQL Left Join 产生空行

转载 作者:行者123 更新时间:2023-11-29 06:26:03 24 4
gpt4 key购买 nike

我正在尝试使用下面的查询来过滤一个相当大的表并收集有关已更新数据的用户的数据(包含用于更新的用户 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

最佳答案

您选择的所有列都来自 wclwc 表,所以当 bld 中有一行不有匹配的 wcl 行,您将得到一行 null

您可以选择 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

关于MySQL Left Join 产生空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30920700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com