当前位置:   article > 正文

mysql怎么删除重复数据并且保留其中一条_mysql删除重复数据保留一条

mysql删除重复数据保留一条

现在有张加班表,一个人同一天只允许申请一次加班,就是加班日期和userid相同的数据应该只有一条,但是现在由于之前没有做限制,导致很多数据重复

怎么通过sql删掉重复数据

思路:先查询重复数据的最大id(唯一一条),然后查询出所有重复数据,并且id不等于最大id的数据,然后删除即可

分解成几步,这样思路就相对清晰了

1.首先要知道怎么查询重复数据 就是SPONSOR_ID和datetime相同的数据

  1. SELECT
  2. id
  3. FROM
  4. t_yszg_grsq q
  5. WHERE
  6. q.FORM_CODE = 303
  7. AND q.FINISH_STATUS = 3
  8. AND q.DELFLAG = 1
  9. GROUP BY
  10. q.SPONSOR_ID,
  11. q.datetime
  12. HAVING
  13. count(*) > 1

先查询重复数据的id

在查询最大的id就简单了,稍微改下

  1. SELECT
  2. max( ID ) AS maxid
  3. FROM
  4. t_yszg_grsq q
  5. WHERE
  6. q.FORM_CODE = 303
  7. AND q.FINISH_STATUS = 3
  8. AND q.DELFLAG = 1
  9. GROUP BY
  10. q.SPONSOR_ID,
  11. q.datetime
  12. HAVING
  13. count(*) > 1

2.查询出重复的数据的SPONSOR_ID和datetime,

  1. SELECT
  2. t.SPONSOR_ID,
  3. t.datetime
  4. FROM
  5. (
  6. SELECT
  7. q.SPONSOR_ID,
  8. q.datetime
  9. FROM
  10. t_yszg_grsq q
  11. WHERE
  12. q.FORM_CODE = 303
  13. AND q.FINISH_STATUS = 3
  14. AND q.DELFLAG = 1
  15. GROUP BY
  16. q.SPONSOR_ID,
  17. q.datetime
  18. HAVING
  19. count( 1 ) > 1
  20. ) AS t;

3.然后查询出SPONSOR_ID和datetime等于上面的数据,那么就可以查询出所有重复的数据,然后再删除不是最大id的数据

  1. SELECT
  2. id
  3. FROM
  4. t_yszg_grsq
  5. WHERE
  6. ( SPONSOR_ID, datetime ) IN (
  7. SELECT AT
  8. .SPONSOR_ID,
  9. AT.datetime
  10. FROM
  11. (
  12. SELECT
  13. SPONSOR_ID,
  14. datetime
  15. FROM
  16. t_yszg_grsq
  17. WHERE
  18. FORM_CODE = 303
  19. AND FINISH_STATUS = 3
  20. AND DELFLAG = 1
  21. GROUP BY
  22. SPONSOR_ID,
  23. datetime
  24. HAVING
  25. count(*) > 1
  26. ) AT
  27. )

4.现在就简单了,只要删除在3中不在1中的数据即可,逻辑删除DELFLAG=0

  1. SELECT
  2. id
  3. FROM
  4. t_yszg_grsq
  5. WHERE
  6. ( SPONSOR_ID, datetime ) IN (
  7. SELECT AT
  8. .SPONSOR_ID,
  9. AT.datetime
  10. FROM
  11. (
  12. SELECT
  13. SPONSOR_ID,
  14. datetime
  15. FROM
  16. t_yszg_grsq
  17. WHERE
  18. FORM_CODE = 303
  19. AND FINISH_STATUS = 3
  20. AND DELFLAG = 1
  21. GROUP BY
  22. SPONSOR_ID,
  23. datetime
  24. HAVING
  25. count(*) > 1
  26. ) AT
  27. )
  28. AND ID NOT IN (
  29. SELECT
  30. mt.maxid
  31. FROM
  32. (
  33. SELECT
  34. max( ID ) AS maxid
  35. FROM
  36. t_yszg_grsq q
  37. WHERE
  38. q.FORM_CODE = 303
  39. AND q.FINISH_STATUS = 3
  40. AND q.DELFLAG = 1
  41. GROUP BY
  42. q.SPONSOR_ID,
  43. q.datetime
  44. HAVING
  45. count(*) > 1
  46. ) AS mt
  47. );

sql看起来复杂,分解成几步,思路清晰,其实也很简单

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/48969
推荐阅读
相关标签
  

闽ICP备14008679号