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 BY
和GREATEST
获取您的数据:
SELECT empID, max(GREATEST(Pref01, Pref02, Pref03, Pref04)) FROM emp GROUP BY empID
您可以使用exists
或in
直接在emp 表中查找行
【讨论】:
以上是关于MySQL,删除重复项的主要内容,如果未能解决你的问题,请参考以下文章