您是否可以构建一个MySQL查询来显示条件查询中未找到的结果

您是否可以构建一个MySQL查询来显示条件查询中未找到的结果,mysql,Mysql,我试图找出如何找到不存在于一个表中的电子邮件使用的电子邮件从条件 我可以用这些电子邮件创建一个表格,但对于我所需要的东西来说,这似乎有些过头了。 我要找的是一个查询,它将向我显示条件值和NULL作为用户ID 这可能吗 我有这样一个问题: SELECT u.uid, u.mail FROM `users` u WHERE u.mail IN ( 'alot@of', 'emails@that', 'ineed@tofind', ) 这在查找电子邮件和关联用户id方

我试图找出如何找到不存在于一个表中的电子邮件使用的电子邮件从条件

我可以用这些电子邮件创建一个表格,但对于我所需要的东西来说,这似乎有些过头了。 我要找的是一个查询,它将向我显示条件值和NULL作为用户ID

这可能吗

我有这样一个问题:

SELECT u.uid, u.mail    
FROM `users` u
WHERE u.mail IN (
    'alot@of',
    'emails@that',
    'ineed@tofind',
)
这在查找电子邮件和关联用户id方面非常有效。现在我需要确定结果中不存在哪些电子邮件。我目前只使用56封电子邮件,其中6封未出现在列表中。我正在试图确定哪些电子邮件没有找到

不在
中无法工作,因为我有超过40000个用户。我只想识别在我的网站上找不到的电子邮件。我有56封电子邮件,只有50个结果。我需要确定未找到的6个(它们可能根本不在表中)

让我再进一步澄清一下: 我收到了系统中假定帐户的电子邮件列表。我正在尝试从给定的电子邮件中查找帐户。这部分很好。现在,我遇到的问题是,我收到了56封电子邮件,但只找到了50封。我需要确定56封邮件中有哪些没有找到。这些电子邮件都被扔进了有条件的邮箱<代码>不在中将不起作用,因为它将返回除找到的50个用户之外的所有用户。(大约40000)我只需要识别表中未找到的条件邮件中的电子邮件


感谢您提供我所需的见解或建议。

如评论中所述,
不在
中可能会有所帮助。但也有其他方法。其中之一是将表与查询结果左键联接,并仅显示不重合的行:

select u.uid, u.mail
from users as u
     left join (
         select u.uid, u.mail 
         from users 
         where mail in ('alot@of','emails@that','ineed@tofind')
     ) as a on u.uid = a.uid
where a.uid is null;
将需要的字段添加到联接中(如果
uid
不够)


所以你的问题现在变得更复杂了。。。您希望查找表中未找到的所有处于您的状态的电子邮件

据我所知,没有一个简单的SQL语句可以告诉你。。。但是你可以使用临时表并得到它。解决方案意味着:

  • 创建一个临时表以保存要搜索的值(并向其中添加适当的索引)
  • 插入要搜索的值
  • 执行
    select
    查询以查找不匹配的行
  • 所以。。。让我们开始吧:

    -- 1. Create a temp table to hold the values
    drop table if exists temp_search_values;
    create temporary table temp_search_values (
        mail varchar(100),
        unique index idx_mail(mail) -- Don't allow duplicate values here
    );
    
    -- 2. Insert the search values
    insert into temp_search_values (mail) values
    ('alot@of'),('emails@that'),('ineed@tofind');
    
    -- 3. Execute the query
    select a.*
    from users as u
         left join temp_search_values as a on u.mail = a.mail
    where u.mail is null;
    

    请记住:临时表仅对创建它们的连接可见,并在连接关闭或终止时删除。

    如注释中所述,
    不在
    中可能会有所帮助。但也有其他方法。其中之一是将表与查询结果左键联接,并仅显示不重合的行:

    select u.uid, u.mail
    from users as u
         left join (
             select u.uid, u.mail 
             from users 
             where mail in ('alot@of','emails@that','ineed@tofind')
         ) as a on u.uid = a.uid
    where a.uid is null;
    
    将需要的字段添加到联接中(如果
    uid
    不够)


    所以你的问题现在变得更复杂了。。。您希望查找表中未找到的所有处于您的状态的电子邮件

    据我所知,没有一个简单的SQL语句可以告诉你。。。但是你可以使用临时表并得到它。解决方案意味着:

  • 创建一个临时表以保存要搜索的值(并向其中添加适当的索引)
  • 插入要搜索的值
  • 执行
    select
    查询以查找不匹配的行
  • 所以。。。让我们开始吧:

    -- 1. Create a temp table to hold the values
    drop table if exists temp_search_values;
    create temporary table temp_search_values (
        mail varchar(100),
        unique index idx_mail(mail) -- Don't allow duplicate values here
    );
    
    -- 2. Insert the search values
    insert into temp_search_values (mail) values
    ('alot@of'),('emails@that'),('ineed@tofind');
    
    -- 3. Execute the query
    select a.*
    from users as u
         left join temp_search_values as a on u.mail = a.mail
    where u.mail is null;
    

    请记住:临时表仅对创建它们的连接可见,并且在连接关闭或终止时被删除。

    NULL是一个奇怪的结果。这不是真的,也不是假的。如果你想检查它,你必须特别注意

    SELECT u.uid, u.mail    
    FROM `users` u
    WHERE u.mail NOT IN (
        'alot@of',
        'emails@that',
        'ineed@tofind',
    ) and u.uid IS NULL
    
    *哦,我明白你的意思了。这会管用的,虽然不太好看*

    select * from 
    (SELECT  'emails@that' as v
    UNION SELECT 'alot@of' as v,
    UNION SELECT 'ineed@tofind' as v
    ) as test
    left join users on u.mail = test.v
    where u.uid is null
    

    NULL是一个奇怪的结果。这不是真的,也不是假的。如果你想检查它,你必须特别注意

    SELECT u.uid, u.mail    
    FROM `users` u
    WHERE u.mail NOT IN (
        'alot@of',
        'emails@that',
        'ineed@tofind',
    ) and u.uid IS NULL
    
    *哦,我明白你的意思了。这会管用的,虽然不太好看*

    select * from 
    (SELECT  'emails@that' as v
    UNION SELECT 'alot@of' as v,
    UNION SELECT 'ineed@tofind' as v
    ) as test
    left join users on u.mail = test.v
    where u.uid is null
    

    如果不创建一些额外的项目来跟踪电子邮件,就没有办法做你想做的事情。基本上,您试图让MySQL告诉您在WHERE部分中找不到哪些项,但MySQL只能告诉您表中的行

    您需要创建一个存储列表中电子邮件地址的辅助表,称之为
    list
    。我会把它做成一个只有电子邮件的单列表格。然后左键将其与
    users
    表连接,并找到uid为null的位置

    SELECT u.uid, l.mail
    FROM `list` l
    LEFT JOIN `users` u ON u.mail=l.mail
    WHERE u.uid IS NULL
    

    如果不创建一些额外的项目来跟踪电子邮件,就没有办法做你想做的事情。基本上,您试图让MySQL告诉您在WHERE部分中找不到哪些项,但MySQL只能告诉您表中的行

    您需要创建一个存储列表中电子邮件地址的辅助表,称之为
    list
    。我会把它做成一个只有电子邮件的单列表格。然后左键将其与
    users
    表连接,并找到uid为null的位置

    SELECT u.uid, l.mail
    FROM `list` l
    LEFT JOIN `users` u ON u.mail=l.mail
    WHERE u.uid IS NULL
    

    你有没有考虑过
    不在()
    ?没有它我们怎么办。
    不在
    对我的需要不起作用。我有超过40000个用户,我只想知道我的条件,这是找不到的。换句话说,我有56封电子邮件,我只收到50封结果。我想确定未找到的6。您是否考虑过
    不在()
    ?如果没有它,我们可以做什么。
    不在
    将无法满足我的需要。我有超过40000个用户,我只想知道我的条件,这是找不到的。换句话说,我有56封电子邮件,我只收到50封结果。我想标识未找到的6。我想将NULL作为用户id,因为没有用户id。
    不在
    中不会起作用,因为这不是我要做的。这将返回表中不在我的列表中的所有用户。与我想要的正好相反。我只是想找出那些没有找到的电子邮件,因为它们根本不在表中。回答cor