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_product を持つレコードを更新したいと思います。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'); 
4

4 に答える 4

2

これを試すことができます:

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'

sqlfiddle demo

内部クエリは、一意の product_id を持つ行のみを取得し、id_lang = 1 を持つ行を更新します。

于 2013-10-31T12:16:07.130 に答える
2

あなたが作るようにこれを行いますが、内側の選択を行うだけです。

 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 ); 

ここでデモ

于 2013-10-31T12:09:35.097 に答える
0

リクエストに矛盾があります:

p.id_product not in

に対して

p.id_product= ps.id_product
于 2013-10-31T12:05:44.430 に答える
0
UPDATE `ps_product_lang` p 
SET    p.`id_lang` = '2' 
WHERE  p.`id_lang` = '1' 
AND id_product IN(SELECT id_product FROM
(SELECT  id_product FROM ps_product_lang GROUP BY    id_product HAVING COUNT(*)=1 )as x)

SQLフィドル

于 2013-10-31T12:07:17.970 に答える