2016-08-01 145 views
-1

我正在处理一个mysql查询需求。检查mysql表中是否存在不存在的记录

有一个表详细以下细节

Id Emails 

1 [email protected] 
2 [email protected] 
3 [email protected] 
4 [email protected] 
5 [email protected] 
6 [email protected] 
7 [email protected] 
8 [email protected] 
9 [email protected] 
10 [email protected] 

它是一种非常巨大的表,但我展示你作为一个示例表

有时候,我收到的电子邮件的列表,以检查它们的存在,在详细表。

让说,如果我得到的电子邮件ID的喜欢[email protected][email protected][email protected]

我想是在不存在输出给出了三个电子邮件的邮件列表在要求检查即[email protected]

将是查询检查内容电子邮件的ID没有在表中的细节存在出给定的要求(ab​​[email protected][email protected][email protected]

谢谢提前!

+0

你只是问什么'哪里'标准适用?你有什么尝试?也许看看用'不在'... – sgeddes

+0

欢迎来到SO。 请阅读[我可以问哪些主题](http://stackoverflow.com/help/on-topic) 和[如何提出一个好问题](http://stackoverflow.com/help/how-to - 问) 和[完美的问题](http://codeblog.jonskeet。英国/ 2010/8月29日/写最完美的 - 问题/) 和[如何创建一个最小的,完整的和可验证的示例](http://stackoverflow.com/help/mcve) SO是**不是免费的编码或代码转换或调试或教程或图书馆查找服务**你也可以表明你已经取得了一些努力来解决你自己的问题。 – RiggsFolly

+0

@RiggsFolly,更新的问题,现在我希望它与复杂清除我期待要解决的! :) – Kate

回答

0

在SQL结果中获取不存在的东西是非常棘手的,因为为了出现在结果集中,某个项必须存在于某处(作为列中的值或作为硬编码值该查询,或者作为从其中一个导出的的值)。由于您想获得包含不会出现在表中的值的结果集,因此您需要执行多个查询。幸运的是,你可以嵌套它们。

select addr, Emails from 
    (select '[email protected]' as addr 
    union select '[email protected]' as addr 
    union select '[email protected]' as addr) as fd 
left outer join Details on Details.Emails = fd.addr 
having Emails IS NULL 

我们做了一堆的union -ed select s到建立的搜索的价值“表”。然后,我们将该表加入Details表,并且只保留加入失败的行(加入的表为NULL)。

See the SQL Fiddle

1

最简单的方法来做到这一点是:

SELECT * FROM {yourTable} WHERE eMails="the email address" 

或者多个:

SELECT * FROM {yourTable} 
WHERE eMails IN ({comma separated and quoted list of email addresses}) 

如果返回零个记录,电子邮件地址不存在。

一个限制:根据您的DBMS设置,IN语句限制为最大数量的值。保重你不要超过这个,否则你会得到一个错误或没有有效的回应。

如果您使用真正的长列表,然后将它们插入到临时表中并将该表与基表连接以获取未使用的列表。

+0

这个逻辑我知道写你的代码,但我想是不存在的输出了在要求给出的三封邮件的检查,即ZZZ邮件列表@ mail.com! – Kate

+0

您将不得不添加一个检查循环或使用临时表解决方案。使用临时表,您可以使用'LEFT JOIN'和'WHERE temptable.value IS NOT NULL'来保留不存在的值。 –

+0

你不能只使用'NOT IN({逗号分隔和引用的电子邮件地址列表}) – RiggsFolly