MySQL,删除重复项

Posted

技术标签:

【中文标题】MySQL,删除重复项【英文标题】:MySQL, Remove duplicate 【发布时间】:2016-11-19 01:19:36 【问题描述】:

我需要从表中删除重复项,但 mysql 无法正常工作

Create table emp
( empID INT(5) PRIMARY KEY,
Pref01 int(1),
Pref02 int(1),
Pref03 int(1),
Pref04 int(1))
empID, Pref01, Pref02, Pref03, Pref04 ====================================== 00011 1 2 0 0 00011 1 3 0 0 00022 1 1 0 0 00022 0 3 0 0

我需要保留这些记录

00011 1 3 0 0 00022 0 3 0 0

我还需要保留所有 pref null 值的记录 这是我的 sql:

select empID 
FROM emp 
where max(Pref01) or max (Pref02) or max(Pref03) or max(Pref04) 
    or Pref01 is null or Pref02 is null or Pref03 is null or Pref04 is null 

【问题讨论】:

max(Pref01) 不是布尔表达式。它可能没有达到您的预期。 另外......问题中不清楚您如何知道为给定的empID保留哪条记录。决定这一点的规则是什么? 我需要保留最大 Pref 编号的记录 来自哪一栏?对于 Pref01 匹配的 id 00022,Pref02 和 Pref04 在一条记录中较高,而 Pref03 在另一条记录中较高。是所有这些决定记录的总和吗?还是依次测试每个,直到一个更大,然后其他无关紧要? 我测试每个序列,直到一个更大,然后与其他 Pref02 或 Pref03 比较,并保持最高 Pref 数的记录 【参考方案1】:

你的问题很复杂,根据给定的信息,我必须做出一个假设来回答它。 假设没有具有相同empID 的记录具有相同的最大首选项数...

SELECT A.* 
FROM emp AS A 
    INNER JOIN (
        SELECT empID, MAX(GREATEST(Pref01, Pref02, Pref03, Pref04)) AS MaxPref 
        FROM emp GROUP BY empID
    ) AS B ON A.empID = B.empID
WHERE
    (Pref01 = MaxPref OR Pref02 = MaxPref OR Pref03 = MaxPref OR Pref04 = MaxPref)
    OR 
    (Pref01 IS NULL AND Pref02 IS NULL AND Pref03 IS NULL AND Pref04 IS NULL)

如果假设不正确,那么代码仍将显示重复的 empID 具有相同的最大首选项数超过一.. 修复它比这段代码复杂得多..

【讨论】:

【参考方案2】:

您可以使用GROUP BYGREATEST 获取您的数据:

SELECT empID, max(GREATEST(Pref01, Pref02, Pref03, Pref04)) FROM emp GROUP BY empID

您可以使用existsin 直接在emp 表中查找行

【讨论】:

以上是关于MySQL,删除重复项的主要内容,如果未能解决你的问题,请参考以下文章

使用单个重复列从 MySQL 数据库中删除重复项 [重复]

删除mysql中所有重复的行

mysql putty 命令删除重复项

mysql 删除重复项

sql Mysql删除重复项

删除 mysql 表上的重复项 [该表 > 2Gb]