【发布时间】: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