mysql - 如何在使用 where 子句时仅查找一列中的重复值?

标签 mysql sql duplicates

目前,我有一个选择查询,在我的客户数据库中查找 X 数量的电子邮件并返回类似这样的内容

SELECT
 first_name,
 last_name,
 email_address,
 date_deleted
FROM CUSTOMERS
WHERE email_address in ('bob.smith@gmail.com', 'john.green@gmail.com', 'simon.anderson@gmail.com', 'carl.thomas@gmail.com');

+----+------------+-----------+---------------------------+--------------+
| id | first_name | last_name | email_address             | date_deleted |
+----+------------+-----------+---------------------------+--------------+
|  1 | bob        | smith     | bob.smith@gmail.com       | 2013-02-18   |
|  2 | NULL       | NULL      | bob.smith@gmail.com       | NULL         |
|  3 | john       | green     | john.green@gmail.com      | NULL         |
|  4 | simon      | anderson  | simon.anderson@gmail.com  | NULL         |
|  5 | carl       | thomas    | carl.thomas@gmail.com     | 2012-09-20   |
|  6 | NULL       | NULL      | carl.thomas@gmail.com     | NULL         |
+----+------------+-----------+---------------------------+--------------+

电子邮件地址列中存在重复的电子邮件地址。我想修改我的查询,以便它仅返回该列中的重复项,并通过 date_deleted 进行过滤。这可能吗?

+----+------------+-----------+---------------------------+--------------+
| id | first_name | last_name | email_address             | date_deleted |
+----+------------+-----------+---------------------------+--------------+
|  1 | bob        | smith     | bob.smith@gmail.com       | 2013-02-18   |
|  2 | carl       | thomas    | carl.thomas@gmail.com     | 2012-09-20   |
+----+------------+-----------+---------------------------+--------------+

最佳答案

在列中查找重复值的最佳方法是使用 HAVING 语句,正如 Mike Tung 在他的评论中提到的那样。

SELECT email_address
  FROM CUSTOMERS
 GROUP BY email_address
HAVING COUNT(1) > 1

这将为您返回以下结果:

+---------------------------+
| email_address             |
+---------------------------+
| bob.smith@gmail.com       |
| carl.thomas@gmail.com     |
+---------------------------+

然后,您可以使用此查询的结果执行您需要的任何其他逻辑。如果我正确理解您的问题,您希望查找具有重复电子邮件地址且 date_deleted 非空的记录。如果是这样,您可以通过以下查询获取该信息:

SELECT CUS.first_name
       ,CUS.last_name
       ,CUS.email_address
       ,CUS.date_deleted
  FROM CUSTOMERS AS CUS
  JOIN (SELECT email_address
          FROM CUSTOMERS
         GROUP BY email_address
        HAVING COUNT(1) > 1) AS C
       ON C.email_address = CUS.email_address
 WHERE CUS.date_deleted IS NOT NULL

这应该给你结果:

+----+------------+-----------+---------------------------+--------------+
| id | first_name | last_name | email_address             | date_deleted |
+----+------------+-----------+---------------------------+--------------+
|  1 | bob        | smith     | bob.smith@gmail.com       | 2013-02-18   |
|  2 | carl       | thomas    | carl.thomas@gmail.com     | 2012-09-20   |
+----+------------+-----------+---------------------------+--------------+

关于mysql - 如何在使用 where 子句时仅查找一列中的重复值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47141344/

相关文章:

mysql - mysql表的条件语句

Mysql JSON_MERGE_PATCH 正在完全替换第一个 json

java - ArrayList 更新不正确,最后一项覆盖了所有内容

php - 当反斜杠多次转义时替换它们

Mysql 连接 4 个有空行的表

sql - 如何避免在 WHERE 查询中为 Unicode 字符串添加 'N' 前缀?

mysql - 创建外部表需要很长时间

python - 删除重复的嵌套列表Python依赖于位置

python - 以最快的方式确定 Python 数组中每组重复值的索引

c# - 执行从 C# 到 MySQL 的 INSERT 语句的正确方法