我想从一个包含多个用户的表中删除除用户最近的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变量来解决我的偏移问题?
答案 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不支持两种“明显”的方法。
OFFSET
的{{1}}子句中的LIMIT
。DELETE
子句中的操作(不会给查询添加额外的复杂性)。