各位大佬们好,我现在有这样一个问题:
表newMail和表mailAddress.
--------------------
newMail:
ID     mail        Flag
1    [email protected]      NULL
2    [email protected]      NULL
3    [email protected]     X
4    [email protected]      X
-----------------
mailAddress:
ID     mail          Tag
1    [email protected]      NULL
2    [email protected]        NULL
3    [email protected]       NULL
4    [email protected]      X
-----------------
如何才能得到两个表中的所有mail,但不包含重复的mail,单个表中Flag或Tag字段为X的也不包含.
上面两个表中我希望得到的mail为:[email protected],[email protected],[email protected]
我用
SELECT DISTINCT `mail` FROM `newMail` where `Flag` is NULL
UNION
SELECT DISTINCT `mail` FROM `mailAddress` where `Tag` is NULL
会得到[email protected][email protected][email protected][email protected],多了个[email protected]
请问大佬们怎么修改?谢谢了,我一直在线

解决方案 »

  1.   

    select mail from newMail
    union
    select mail from mailAddress;
      

  2.   

    liangCK()兄弟,谢谢你的回答!
    这样是不行的.
    我希望得到"两个表中的所有mail,但不包含重复的mail,单个表中Flag或Tag字段为X的也不包含."
    你这样的写法没有考虑到Flag或Tag字段.
      

  3.   

    早说啊.select mail from newMail where id in(select id from newMail where flag='X')
    union
    select mail from mailAddress where id in(select id from mailAddress where tag='X')
    ;
      

  4.   

    谢谢liangCK()兄弟的回答
    ------------
    照兄弟所说的这样写还是有问题哦,结果里面还是会多个[email protected]...真郁闷 :(
      

  5.   

    方法1:最笨的方法
    就是建一张临时表。把所有数据和所要的字段插入到一张表中。然后再搞一个联合关键字alert.....union() 就把相同的mail去掉了。
    方法2:left join  where 方法3: not exists
      

  6.   

    union后,用is null就得不到null了
    你需要在查询的时候,把null改称一个标志,比如说1,或者什么的,
    然后再where就可以了
      

  7.   

    按照LZ的意思只有两个MAIL地址。
    [email protected]也是重复。
    mysql> select * from newmail;
    +----+---------------+------+
    | id | mail          | flag |
    +----+---------------+------+
    |  1 | [email protected] | NULL |
    |  2 | [email protected] | NULL |
    |  3 | [email protected] | x    |
    |  4 | [email protected] | x    |
    +----+---------------+------+
    4 rows in set (0.00 sec)mysql> select * from mailaddress;
    +----+----------------+------+
    | id | mail           | tag  |
    +----+----------------+------+
    |  1 | [email protected] | NULL |
    |  2 | [email protected]  | NULL |
    |  3 | [email protected]  | NULL |
    |  4 | [email protected]  | x    |
    +----+----------------+------+
    4 rows in set (0.00 sec)mysql> select mail,flag from (select mail,flag from newmail union all select mai
    l,tag from mailaddress) t group by mail
        -> having count(mail) = 1 and flag is null;
    +----------------+------+
    | mail           | flag |
    +----------------+------+
    [email protected] | NULL |
    [email protected]  | NULL |
    +----------------+------+
    2 rows in set (0.00 sec)
      

  8.   

    在用 union 不带有的ALL的时候本身就已经去掉了重复的纪录,所以无论如何也不会去掉[email protected] 这个EMAIL。
      

  9.   


    这样得出来的结果才是楼主要要的结果:
    select email,tag, count(email) from 
    (select email,tag from a 
    union all
    select email,flag from b)
    t  group by email
    having count(email)>=1 and tag is null结果:
    [email protected],[email protected],[email protected]
      

  10.   

    [email protected]
    是重复的。
    LZ的要求是不要得到重复的EMAIL。所以只有两条EMAIL
      

  11.   

    楼主的意思应该不是这样的吧,要所有的email,只是没要有重复的。意思是说重复的去掉重复的那条保留一条吧。看楼主自己做的时候想的结果得知。
      

  12.   

    newMail out join mailAddress,用外连接查询,再根据你的查询条件,就出来了
      

  13.   

    看大家这么踊跃,我也来一个。
    按照人怎么去做,程序就怎么写的思路,总能写出来的:SELECT * 
    FROM (SELECT mail
    FROM newmail
    WHERE flag IS NULL
    UNION 
    SELECT mail
    FROM mailaddress
    WHERE tag IS NULL
    )a
    WHERE NOT 
    EXISTS (SELECT * 
    FROM (SELECT mail
    FROM newmail
    WHERE flag = "x"
    UNION 
    SELECT mail
    FROM mailaddress
    WHERE tag = "x"
    )b
    WHERE a.mail = b.mail
    )