Mysql如何使用count函数更新n行?

Posted

技术标签:

【中文标题】Mysql如何使用count函数更新n行?【英文标题】:Mysql How to update n rows using count function? 【发布时间】:2020-07-16 13:30:52 【问题描述】:

在下表中,如果同一 orgid 的总记录超过 500,我想设置 delete = true 我想根据 createdate 来做,这样如果记录超过 500,旧记录将被删除,并使该 orgid 的总记录为 500。

这是我的桌子

Table A
+----+-------+------------------+--------+------------+
| id | orgid | transactionvalue | delete | createdate |  
+----+-------+------------------+--------+------------+
|  1 |     1 |              123 | false  | 05-16-2020 |  
|  2 |     1 |              412 | false  | 07-16-2020 |  
|  3 |     2 |              762 | false  | 07-16-2020 |  
+----+-------+------------------+--------+------------+

这是我正在尝试的查询

update A 
set 
  delete = true 
where orgid = 1 
and (select count(*) as records 
      from (select * 
            from A order by createdate
    ) as pseudotable)) >500

【问题讨论】:

您可以通过提供 3 家公司(每家 5 家)保留 2 家的样本数据来澄清和简化。 你运行的是什么版本的 mysql @EricBrandt 8.0.17 【参考方案1】:

使用子查询并加入更新

   UPDATE tablea
            INNER JOIN
        (select orgid, count(*) cnt from tablea group by orgid
        ) b ON tablea.orgid = b.orgid 
    SET 
        delete = 'true'
    where cnt>500

【讨论】:

Createdate 肯定会出现在某个地方吗? 按createdate desc排序?【参考方案2】:

您可以使用row_number() 查找每个组织的第 500 条记录,然后使用该信息:

update tablea a join
       (select a2.org_id, a2.created_date as cutoff_created_date
        from (select a2.*,
                     row_number() over (partition by a2.org_id order by create_date desc) as seqnum
              from tablea a2
             ) a2
        where a2.seqnum = 500
       ) a2
       on a.org_id = a2.org_id and and
          a.created_date < a2.cutoff_created_date
    set delete = true;

【讨论】:

【参考方案3】:

我没有尝试所有其他答案,它们可能是正确的,但这对我有用

update A 
set `delete` = true 
where orgid = 1 AND id IN (
SELECT id FROM  A where orgid = 1
order by createdate DESC
LIMIT 500,18446744073709551615);

【讨论】:

以上是关于Mysql如何使用count函数更新n行?的主要内容,如果未能解决你的问题,请参考以下文章

如何运行 mySQL 函数来更新所有行?

MySQL优化COUNT()查询

如何在没有存储函数的情况下更新 MySQL 行?

如果 COUNT = 0 [重复],如何在 mySQL 中插入或更新查询

初学者:如何使 COUNT 函数不会在 Join 中重复出现? MYSQL

如何使用 MySQL 中的每一行动态更新所有行? [复制]