【问题标题】:MySQL query to delete rows whose dates are close to another rowMySQL查询删除日期接近另一行的行
【发布时间】:2009-05-24 01:29:43
【问题描述】:

我有一个包含许多行的表格。保证已按名为created_on 的列的顺序插入行,该列是datetime 列。如果给定行在现有行的 5 秒内有 created_on 时间,我想删除给定行。

如何编写查询来删除这些行?

【问题讨论】:

    标签: mysql database date delete-row


    【解决方案1】:
    SELECT *
    FROM TABLE AS A
    WHERE EXISTS (
        SELECT *
        FROM TABLE AS B
        WHERE DATE_SUB(A.created_on, INTERVAL 5 SECOND) <= B.created_on
            AND B.created_on < A.created_on
    )
    

    你明白了,这基本上会删除所有5秒内的事件链,除了链中的第一个事件。

    因为您不能在 DELETE 中为表设置别名,所以您必须执行以下操作:

    DELETE
    FROM   so902859
    WHERE   created_on IN (
            SELECT  created_on
            FROM   so902859 AS A
            WHERE   EXISTS ( SELECT *
                             FROM  so902859 AS B
                             WHERE  DATE_SUB(A.created_on, INTERVAL 5 SECOND) <= B.created_on
                                    AND B.created_on < A.created_on ) )
    

    有上百万种方法可以使用 JOIN 或其他方法来给这只猫剥皮。我认为这是最清楚易懂的,虽然有点冗长。

    【讨论】:

    • 是的,这就是我的目标。谢谢,我会试一试。
    • 嗯,我在使用它时遇到语法错误。这是括号中的查询: [[ delete from sessions as lhs where exists ( select * from sessions as rhs where date_sub(lhs.created_at, interval 5 seconds)
    • AFAIK where exists 不适用于 delete,仅适用于 select。我不确定如何制定它以在一个查询中工作。
    • 这不是 EXISTS 的问题,而是别名的问题。请参阅我的更新答案。
    • 这表明 mysql 产生的错误消息是多么无用。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签