SQL在具有限制的选择查询后删除行

时间:2017-02-03 17:42:28

标签: mysql sql sql-delete

我想从一个包含多个用户的表中删除除用户最近的20个测试之外的所有测试。

尝试1:

DELETE FROM tests WHERE EXISTS (SELECT * FROM tests WHERE user_id = 38 ORDER BY test_timestamp DESC LIMIT 20, 100);

尝试2:

DELETE FROM tests WHERE user_id = 38 ORDER BY test_timestamp DESC LIMIT 20, 100;

我是否可以对上述任何一个示例进行任何更改,或者我是否需要使用PHP设置rowcount变量来解决我的偏移问题?

3 个答案:

答案 0 :(得分:1)

尝试:

DELETE FROM tests 
WHERE tests.user_id = 38
and tests.ID in (SELECT id 
FROM tests t
WHERE t.user_id = tests.user_id
ORDER BY test_timestamp DESC LIMIT 20, 100);

答案 1 :(得分:0)

对于尝试1,这是正确的语法

delete from tests
where the primary key field in 
(select the primary key field 
etc
)

答案 2 :(得分:0)

在MySQL中,您可以使用join

执行此操作
DELETE t
    FROM tests t JOIN
         (SELECT tt.timestamp
          FROM tests tt
          WHERE t.user_id = 38
          ORDER BY tt.timestamp DESC
          OFFSET 19 LIMIT 1
         ) tt
         ON t.user_id = tt.user_id and t.timestamp < tt.timestamp;

MySQL不支持两种“明显”的方法。

  • MySQL不支持OFFSET的{​​{1}}子句中的LIMIT
  • MySQL不支持正在修改的表的DELETE子句中的操作(不会给查询添加额外的复杂性)。