删除所有未更改的条目(sql)

时间:2014-02-12 19:43:59

标签: mysql sql

我得到了下表player_teams,其中包含这样的数据

| id | p_id | year | t_id |
---------------------------
| 1  | 1    | 2001 | 1    |
| 2  | 1    | 2002 | 1    |
| 3  | 1    | 2003 | 1    |
| 4  | 1    | 2004 | 3    |
| 5  | 2    | 2001 | 1    |
| 6  | 2    | 2003 | 1    |
| 7  | 2    | 2004 | 2    |
| 8  | 2    | 2006 | 3    |
| 9  | 2    | 2007 | 1    |

fiddle now
fiddle result

现在我想删除t_id没有更改为year列中下一个较小条目的每个条目。 p_id当然必须是相同的。

所以在这个案例中,应删除id 2,3和6。

1:玩家的第一次进入(不要删除)
2:2001年没有变化(删除)
3:2002年没有变化(删除)
4:t_id改为2003年(不要删除)
5:玩家的第一次进入(不要删除)
6:没有变化到2001年(2002年缺失)(删除)
7:t_id改为2003年(不要删除)
8:t_id改为2004年(2005年缺席)(不要删除)
9:t_id改为2006年(不要删除)

请注意,所有列都可能会遗漏特定值,而不会对其进行排序。

目标只是改变球员所在队伍,而不是每年。

我不知道它是否可能与sql或我必须编写一个程序来执行它。

THX

2 个答案:

答案 0 :(得分:3)

DELETE player_teams.*
FROM
  player_teams LEFT JOIN (SELECT p_id, MIN(year) As min_year
                          FROM player_teams
                          GROUP BY p_id, t_id) p
  ON player_teams.p_id = p.p_id AND player_teams.year=p.min_year
WHERE
  p.p_id IS NULL

请参阅小提琴here。或者您可以使用它:

DELETE p1.*
FROM
  player_teams p1 INNER JOIN player_teams p2
  ON p1.p_id=p2.p_id
     AND p1.t_id = p2.t_id
     AND p1.year>p2.year

小提琴是here

修改

如果您需要保留第9行,因为t_id更改为1,2,3然后更改回1,则需要使用更复杂的查询,如下所示:

DELETE
  player_teams.*
FROM
  player_teams INNER JOIN (
    SELECT p1.p_id, p1.year, MAX(p2.year) prev_year
    FROM
      player_teams p1 LEFT JOIN player_teams p2
      ON p1.p_id = p2.p_id AND p1.year>p2.year
    GROUP BY
      p1.p_id, p1.year) ny
  ON player_teams.p_id = ny.p_id AND
     player_teams.year = ny.year
  INNER JOIN player_teams pny
  ON ny.p_id = pny.p_id
     AND ny.prev_year=pny.year
     AND player_teams.t_id = pny.t_id

小提琴是here

答案 1 :(得分:0)

试试这个,看它是否有效。

DELETE FROM Table
WHERE id IN (SELECT id FROM Table t1 
              WHERE t1.id > id AND t1.p_id = p_id AND t_id = t1.t_id)