对于我要做的事情来说,临时表可能是多余的。基本上,我想反转以下MySQL查询:
select email
from email_newsletter_subscriptions
where unsubscribeDate is not null
and email in (
# CSV list of email address
)
这个查询为我提供了表中存在且已取消订阅的电子邮件地址列表。我想要的是我的CSV中不存在于email_newsletter_subscriptions
或存在但unsubscribeDate
为空的电子邮件列表。
我发现了一个疯狂的工作,它对我的数据集(~1k行)来说非常快,但是对于更大的输入集来说却变得笨拙。
select email from (select 'john.doe@exmple.com' as email union all
select 'jane.do@example.com' as email) e
left join email_newsletter_subscriptions ens using(email)
where ens.email is null OR ens.unsubscribeDate is null;
是否有一个更简单的语法,可以只是把输入作为一个CSV,而不必把每一行变成一个select ... union all
怪物?
我也知道我们可以将这些加载到临时表中并获得更多选项,但我真的希望有一个简单的单查询方法用于复制粘贴(我并不总是在目标环境中具有临时表权限)。
临时表是正确的解决方案。您可以使用LOAD DATA LOCAL从本地客户端上传它,然后运行一个类似于您已经发布的查询。
CREATE TEMPORARY TABLE local_list (email VARCHAR(255) PRIMARY KEY );
LOAD DATA LOCAL INFILE '/tmp/input.csv' INTO TABLE local_list;
SELECT email
FROM local_list
LEFT JOIN email_newsletter_subscriptions ens
USING (email)
WHERE
(ens.email IS NULL)
OR
(ens.unsubscribeDate IS NOT NULL);