繁体   English   中英

MySQL根据子查询设置OFFSET

[英]MySQL set OFFSET depending on subquery


我正在尝试删除所有早于一周的记录,同时为每个用户保留至少一个记录。
例:

| ID | user |   date   | other columns...
|  1 | 1234 | -2 days  | ...    
|  2 | 1234 | -3 days  | ...
|  3 | 1234 | -8 days  | ...
|  4 | 5678 | -9 days  | ...
|  5 | 5678 | -10 days | ...

应该成为

| ID | user |   date   | other columns...
|  1 | 1234 | -2 days  | ...    
|  2 | 1234 | -3 days  | ...
|  4 | 5678 | -9 days  | ... // Keeping the most recent record for this user

到目前为止,我已经做到了,但是它使用CASE来设置OFFSET,所以它不起作用:

DELETE FROM transactions WHERE ID < (
  SELECT ID FROM (
    SELECT ID FROM transactions t WHERE
    DATE(date) <= DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND
    user = transactions.user 
    ORDER BY ID DESC
    LIMIT 1 OFFSET CASE WHEN EXISTS (
      SELECT ID FROM transactions x WHERE
      DATE(date) > DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND
      user = transactions.user
    ) THEN 0 ELSE 1 END
  )
)

所以问题是:如何修复上面的代码?

PS:除SQL的大多数基本操作外,我对其他任何事物都比较陌生

通过按用户对事务进行分组 ,可以确定要保留的事务:

SELECT   user, MAX(date) date
FROM     transactions
GROUP BY user

然后,您可以使用多表DELETE语法在这些结果和原始表之间建立外部DELETE ,以便仅删除所需的记录:

DELETE transactions
FROM   transactions NATURAL LEFT JOIN (
         SELECT   user, MAX(date) date
         FROM     transactions
         GROUP BY user
       ) t
WHERE  date < CURRENT_DATE - INTERVAL 7 DAY
   AND t.date IS NULL

尝试

DELETE FROM transactions tt WHERE tt.id NOT IN (
SELECT ID FROM transactions t WHERE
    DATE(t.date) <= DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND
    t.user = tt.transactions.user 
    ORDER BY t.ID DESC limit 1
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM