Mysql 使用where not in进行Sql更新

Mysql 使用where not in进行Sql更新,mysql,sql-update,Mysql,Sql Update,我在表ps_product_lang中有这些信息: id_product id_lang 1 1 1 2 1 3 2 1 3 1 4 1 5 1 5 2 5 3 输出应该是 id_product id_lang 1 1 1 2 1 3 2

我在表ps_product_lang中有这些信息:

id_product  id_lang
1           1  
1           2
1           3
2           1
3           1
4           1
5           1
5           2
5           3
输出应该是

id_product  id_lang
1           1  
1           2
1           3
2           2
3           2
4           2
5           1
5           2
5           3
我想更新具有唯一id_产品的记录,id_lang应为1,这意味着涉及第4、第5和第6条记录:

我尝试了这个查询,但不起作用

UPDATE `ps_product_lang` p 
SET    p.`id_lang` = '2' 
WHERE  p.`id_lang` = '1' 
       AND p.id_product NOT IN (SELECT `id_product` 
                                FROM   `ps_product_lang` ps 
                                WHERE  p.id_product = ps.id_product 
                                       AND ps.id_lang = '2'); 

你的要求有矛盾之处:

p.id_product not in
反对

p.id_product= ps.id_product

你的要求有矛盾之处:

p.id_product not in
反对

p.id_product= ps.id_product


在制作时执行此操作,但只需进行内部选择

 UPDATE `ps_product_lang`  
 SET    `id_lang` = '2' 
 WHERE  `id_lang` = '1' 
   AND id_product NOT IN (select `id_product` from (SELECT `id_product` 
                            FROM   `ps_product_lang`  
                            WHERE  id_product = id_product 
                                   AND id_lang = '2')t ); 

在制作时执行此操作,但只需进行内部选择

 UPDATE `ps_product_lang`  
 SET    `id_lang` = '2' 
 WHERE  `id_lang` = '1' 
   AND id_product NOT IN (select `id_product` from (SELECT `id_product` 
                            FROM   `ps_product_lang`  
                            WHERE  id_product = id_product 
                                   AND id_lang = '2')t ); 
您可以尝试以下方法:

UPDATE `ps_product_lang` p
INNER JOIN (
  SELECT id_product
  FROM ps_product_lang
  GROUP BY id_product
  HAVING COUNT(*) = 1
  ) b ON b.id_product = p.id_product
SET p.`id_lang` = '2'
WHERE p.`id_lang` = '1'

内部查询仅获取具有唯一product_id的行,并更新id_lang=1的行。

您可以尝试以下操作:

UPDATE `ps_product_lang` p
INNER JOIN (
  SELECT id_product
  FROM ps_product_lang
  GROUP BY id_product
  HAVING COUNT(*) = 1
  ) b ON b.id_product = p.id_product
SET p.`id_lang` = '2'
WHERE p.`id_lang` = '1'


内部查询只获取具有唯一product_id的行,而更新id_lang=1的行。

不清楚您到底想要做什么……不清楚您想要做什么。阅读您的问题我认为您缺少或提供了错误的信息。我想更新id_lang为1且具有唯一id的记录表中的id_产品不清楚您到底想要做什么…不清楚您想要什么。阅读您的问题我认为您缺少或提供了错误的信息。我想更新具有id_lang 1且表中具有唯一id_产品的记录MySQL在更新WHERE in()时存在非常糟糕的性能问题。您应该始终使用更新内部连接!MySQL在更新WHERE IN()时存在非常糟糕的性能问题。您应该始终使用更新内部连接!