Mysql 如何运行查询以保持最多3行同名

Mysql 如何运行查询以保持最多3行同名,mysql,sql-update,Mysql,Sql Update,因此,如果有超过3个相同的产品(相同的名称-item\u name)处于活动状态price\u good,我将尝试运行SQL查询以停用列表中的产品。因此,基本上,如果有20个产品具有相同的名称,其中10个处于活动状态price\u good=1,则查询应禁用另外7个price\u good=0,以仅保留3个活动产品 表的结构: id item_name price_good 1 Row 1 1 2 Row 1

因此,如果有超过3个相同的产品(相同的名称-
item\u name
)处于活动状态
price\u good
,我将尝试运行SQL查询以停用列表中的产品。因此,基本上,如果有20个产品具有相同的名称,其中10个处于活动状态
price\u good=1
,则查询应禁用另外7个
price\u good=0
,以仅保留3个活动产品

表的结构:

id     item_name        price_good
1      Row 1            1
2      Row 1            1
3      Row 1            0
4      Row 1            0
5      Row 1            1
6      Row 1            1
7      Row 1            1
8      Row 1            1
9      Row 2            0
10     Row 2            1
我正在尝试运行的查询:

UPDATE ss_remote_inventories t1 
JOIN
  (
    SELECT item_name
      FROM ss_remote_inventories
      WHERE price_good = 1
     GROUP BY item_name
    HAVING COUNT(*) > 3
  ) t2
  ON t1.item_name = t2.item_name
  SET t1.price_good = 0;

您可以使用以下查询来更新表,以保留同一项的前3行

update ss_remote_inventories t
join (
  select a.*
  from ss_remote_inventories a
  where a.price_good = 1  
  and (
    select count(*)
    from ss_remote_inventories b
    where a.item_name = b.item_name
    and b.price_good = 1
    and a.id > b.id
  ) > 2
) t1 on t.id = t1.id 
set t.price_good = 0

内部查询使用主键计算同一项的每一行的排名,而在更新查询中,它只过滤排名大于2的行,并使用id与主表联接

对于更新版本5.7,已将其固定为where子句中的子查询

update ss_remote_inventories t
set t.price_good = 0
where id in (
    select id from(
      select a.*
      from ss_remote_inventories a
      where a.price_good = 1  
      and (
        select count(*)
        from ss_remote_inventories b
        where a.item_name = b.item_name
        and b.price_good = 1
        and a.id > b.id
      ) > 2
    ) t1
);

您是否为表定义了主键?是的,ID。是否更新了问题任意3?最后三个?前3个。。。。。CR或CoC?可以是任意随机3或前3个更好的
您不能为FROM子句中的更新指定目标表“t”您确定它工作吗?我明白了,但为什么它对我不工作?很抱歉问这个问题,可能是MySql版本问题吗?@Sandra我不太确定它是否与版本或其他问题有关Sandra说不通。您能将演示代码复制到您的系统并进行测试吗?因为我这边也很好看。