删除mysql表中的重复对

时间:2016-04-12 21:09:41

标签: mysql

+------+---------+---------+
| id   | user_id | job_id  |
+------+---------+---------+
|   92 |      58 |       4 |
|  896 |      58 |       4 |
|  988 |      58 |      22 |
|  991 |      58 |      22 |
|  894 |      58 |      38 |
|  548 |      58 |      38 |

我想删除user_id具有相同job_id重复项的条目。换句话说,应该只有一个与user_id相关联的不同job_id。在这个例子中,应该只有4,22,38(而不是重复的条目)。只要只有一个job_id与user_id匹配,哪个ID受影响并不重要。

2 个答案:

答案 0 :(得分:4)

您可以使用:

DELETE t1 FROM tab t1, tab t2
WHERE  t1.id < t2.id
  AND t1.user_id = t2.user_id
  AND t1.job_id = t2.job_id;

SqlFiddleDemo

输出:

╔══════╦══════════╦════════╗
║ id   ║ user_id  ║ job_id ║
╠══════╬══════════╬════════╣
║ 896  ║      58  ║      4 ║
║ 991  ║      58  ║     22 ║
║ 894  ║      58  ║     38 ║
╚══════╩══════════╩════════╝

并考虑在列UNIQUE INDEXuser_id上添加job_id以避免此问题。

答案 1 :(得分:2)

您可以使用left join

delete t
    from t left join
         (select min(id) as minid
          from t
          group by user_id, job_id
         ) tt
         on t.id = tt.minid
    where tt.minid is null;