MySQL在UNION表中查找重复的行

时间:2013-03-21 03:14:55

标签: mysql duplicates

如何在以下查询中找到重复的电子邮件?

SELECT b_email AS email FROM user WHERE status = 3 AND b_email != '' 
UNION (SELECT c_email AS email FROM user WHERE status = 3 AND c_email != '') 
UNION (SELECT user_email AS email FROM user WHERE status = 3 AND user_email != '') 
UNION (SELECT user_email AS email FROM sub_user WHERE status = 3 AND user_email != '') 
UNION (SELECT su_email AS email FROM sub_user WHERE status = 3 AND su_email != '') 
ORDER BY email ASC

感谢。

1 个答案:

答案 0 :(得分:2)

您的查询结果不会重复,因为UNION会删除重复项。要保留重复项,请改为使用UNION ALL

SELECT b_email AS email FROM user WHERE status = 3 AND b_email != ''
UNION ALL SELECT c_email AS email FROM user WHERE status = 3 AND c_email != ''
...

要确定哪些电子邮件地址重复,您可以执行以下操作:

  • 更改您的查询以返回所有电子邮件地址列表,包括重复项(这意味着使用UNION ALL代替UNION
  • 使用通过电子邮件地址计算的外部查询
  • 进行换行
  • 将外部查询结果限制为计数为两个或更多的电子邮件地址

以下是如何操作(注意这假设您发布的查询有效):

SELECT email, COUNT(*)
FROM (
  SELECT b_email AS email FROM user WHERE status = 3 AND b_email != '' 
  UNION ALL SELECT c_email AS email FROM user WHERE status = 3 AND c_email != ''
  UNION ALL SELECT user_email AS email FROM user WHERE status = 3 AND user_email != ''
  UNION ALL SELECT user_email AS email FROM sub_user WHERE status = 3 AND user_email != ''
  UNION ALL SELECT su_email AS email FROM sub_user WHERE status = 3 AND su_email != ''
) EmailGlom
GROUP BY email
HAVING COUNT(*) > 1

您的结果将是在内部查询中多次显示的每个电子邮件地址。