Mysql 如何运行查询以保持最多3行同名
因此,如果有超过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
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说不通。您能将演示代码复制到您的系统并进行测试吗?因为我这边也很好看。