MySQL:根据条件删除重复字段,同时保留所有其他数据

时间:2017-11-23 19:26:06

标签: mysql database phpmyadmin

需要一些MySQL查询帮助。

如果记录中有重复的电子邮件字段,则只保留具有STATUS = ACTIVE的行,同时仍显示所有其他记录。

STATUS      EMAIL
—-------------------------------
active      p1@email.com
—-------------------------------
inactive    p1@email.com
—-------------------------------
active      p2@email.com
—-------------------------------
active      p3@email.com
—-------------------------------
active      p4@email.com
—-------------------------------
Inactive    p4@email.com

3 个答案:

答案 0 :(得分:1)

假设有一些事情:

  • 未选择没有重复的行。
  • 未选择任何处于活动状态的重复行。

DEMO

基本上,子查询确定哪些电子邮件是重复的。外部查询使用它来仅选择那些具有重复电子邮件的记录。

select *
from
email_status a
inner join
(
  select email, count(email)
  from email_status
  group by email
  having count(email) > 1
) b
on a.email = b.email
where status = 'active'

编辑:根据下面的回复,选择的唯一标准变为status =' active'假设给定电子邮件只能激活1条记录。所需要的只是where子句:

SELECT *
FROM email_status
WHERE status = 'active'

答案 1 :(得分:0)

以下查询将起作用:

select
(case when count(distinct status) = 2 then 'active'
      else status
 end
) as status,
email
from
yourTableName
group by email;

答案 2 :(得分:0)

我提供了两个查询:

  1. 选择声明。 (DEMO
  2. 删除将删除您在select语句中看到的两行的语句
  3. 选择a。* FROM代理商a INNER JOIN代理b ON b.EMAIL = a.EMAIL 在哪里a.id<> b.id AND LCASE(a.STATUS)='不活跃';

    DELETE a FROM agents a 
    INNER JOIN agents b ON b.EMAIL = a.EMAIL
    WHERE a.id <> b.id AND LCASE(a.STATUS)='inactive';