代码之家  ›  专栏  ›  技术社区  ›  Nick Kapenkar

表“db_session”被指定两次,既作为“DELETE”的目标,也作为单独的数据源

  •  1
  • Nick Kapenkar  · 技术社区  · 8 年前

    DELETE FROM db_session
    where time NOT IN (SELECT MAX(time) FROM db_session GROUP BY username)
    

    SELECT 虽然功能正常。

    1 回复  |  直到 8 年前
        1
  •  6
  •   Gordon Linoff    8 年前

    造成这个问题的唯一数据库(据我所知)是MySQL(和相关数据库)。您可以将逻辑替换为 JOIN :

    delete s
        from db_session s join
             (select username, max(time) as maxtime
              from db_session s2
              group by username
             ) ss
             on s.username = ss.username and s.time < ss.maxtime;
    

    另一个好处是,逻辑也是正确的。逻辑将删除时间不是的最大时间的任何行 任何 username 但是,如果不同的行恰好是某个时间段的最长时间,那么它是否可以为一个用户名保留多行 使用者

    推荐文章