product_id

我在MySQL 5.7.26中有一个表,我在那里存储产品的历史,我没有任何自动递增列。

+------------+---------------------+
| product_id | date_in             |
+------------+---------------------+
|     500 | 2020-04-24 07:10:52 |
|     500 | 2020-04-24 07:12:11 |
|     500 | 2020-04-24 07:16:25 |
|     500 | 2020-04-24 07:18:32 |
|     500 | 2020-04-24 07:18:42 |
|     500 | 2020-04-24 13:51:30 |
|     500 | 2020-04-24 14:01:22 |

|     501 | 2020-04-24 07:10:52 |
|     501 | 2020-04-24 07:12:11 |
|     501 | 2020-04-24 07:16:25 |
|     501 | 2020-04-24 07:18:32 |
|     501 | 2020-04-24 07:18:42 |
|     501 | 2020-04-24 13:51:30 |
|     501 | 2020-04-24 14:01:22 |
+------------+---------------------+

我想只保留每个产品的最后2条历史记录,并删除所有的历史记录,所以它看起来像这样。

+------------+---------------------+
| product_id | date_in             |
+------------+---------------------+

|     500 | 2020-04-24 13:51:30 |
|     500 | 2020-04-24 14:01:22 |


|     501 | 2020-04-24 13:51:30 |
|     501 | 2020-04-24 14:01:22 |
+------------+---------------------+

解决方案:

(后者需要MySQL 8.0)`。row_number()在早期版本中,我们可以阐明

delete t
from mytable t
inner join (
    select 
        product_id, 
        date_in, 
        row_number() over(partition by product_id order by date_in desc) rn
    from mytable t
) t1 
    on  t1.product_id = t.product_id 
    and t1.date_in = t.date_in 
    and t1.rn > 2

子查询 – 假设在 row_number():(product_id, date_in)

delete t
from mytable t
inner join (
    select 
        product_id, 
        date_in,
        (select count(*) from mytable t2 where t2.product_id = t1.product_id and t2.date_in >= t1.date_in) rn
    from mytable t1
) t1 
    on  t1.product_id = t.product_id 
    and t1.date_in = t.date_in 
    and t1.rn > 2;

给TA打赏
共{{data.count}}人
人已打赏
未分类

Symfony4 - 两个实体管理器共享缓存池,是个坏主意还是遇到了bug?

2022-9-9 6:25:17

未分类

如何从java中的类对象列表中获取第一个匹配元素的索引(不需要使用任何第三方库)。

2022-9-9 6:25:19

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索