首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > Mysql >

两个表的对比有关问题

2012-02-16 
两个表的对比问题各位大佬们好,我现在有这样一个问题:表newMail和表mailAddress.--------------------newM

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

[解决办法]
按照LZ的意思只有两个MAIL地址。
kyroc@163.com也是重复。


mysql> select * from newmail;
+----+---------------+------+
| id | mail | flag |
+----+---------------+------+
| 1 | kyroc@163.com | NULL |
| 2 | yiyoc@126.com | NULL |
| 3 | leoha@tom.com | x |
| 4 | nancy@163.com | x |
+----+---------------+------+
4 rows in set (0.00 sec)

mysql> select * from mailaddress;
+----+----------------+------+
| id | mail | tag |
+----+----------------+------+
| 1 | lyroct@126.com | NULL |
| 2 | nancy@163.com | NULL |
| 3 | kyroc@163.com | NULL |
| 4 | xixi@acer.com | 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 |
+----------------+------+
| lyroct@126.com | NULL |
| yiyoc@126.com | NULL |
+----------------+------+
2 rows in set (0.00 sec)
[解决办法]

这样得出来的结果才是楼主要要的结果:
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

结果:
kyroc@163.com,yiyoc@126.com,lyroct@126.com

[解决办法]
看大家这么踊跃,我也来一个。
按照人怎么去做,程序就怎么写的思路,总能写出来的:

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
)

热点排行