3

別の列の ID に基づいて、特定の列内のセルを更新する必要があります。列名はProd_ID、 、Lang_IDおよびDescr:

Prod_ID | Lang_ID | Descr
--------+---------+------
A101    | 1       | TextA
A101    | 2       | TextB
A101    | 3       | TextC

同じ行のグループの場合、後続のすべての説明 (列) を最初の行の説明Prod_IDに置き換える必要があります。Descr正しい説明の行には常にLang_ID = 1. また、テーブルは Lang_ID でソートされない場合があります。

例: TextA(Lang_ID = 1)行が一致するため、TextBandを置き換える必要があります。TextCProd_IDs

4

3 に答える 3

2

他の場所のコメントで、「マスター」lang_idは常に1であると述べました。これにより、物事が大幅に簡素化され、単純な自己結合でこれを行うことができます(サブクエリなし:-)

このクエリは、すべての lang_1 行を選択し、それらを同じ prod_id のすべての非 lang_1 行と結合して更新します。

Lang_ID=1 が常に「最初」の場合

UPDATE products 
  LEFT JOIN products as duplicates
         ON products.Prod_ID=duplicates.Prod_ID 
        AND duplicates.Lang_ID != 1
SET duplicates.Descr = products.Descr
WHERE products.Lang_ID = 1

編集: Lang_ID=1 が「最初」ではない場合

その行の最小の Lang_ID を見つける中間結合を介して、テーブルをそれ自体に結合できます。中間結合を「lang_finder」と呼びました。

UPDATE products 
  LEFT JOIN (SELECT Prod_ID, MIN(Lang_ID) as Lang_ID FROM products GROUP BY Prod_ID) as lang_finder
         ON products.prod_id=lang_finder.prod_id 
  LEFT JOIN products as cannonical_lang 
         ON products.Prod_ID = cannonical_lang.Prod_ID
        AND lang_finder.Lang_ID = cannonical_lang.Lang_ID
SET products.Descr = cannonical_lang.Descr

サブクエリを使用していますが、ネストしていないことに注意してください。サブクエリは基本的に、最も低い Lang_ID の値を持つ列を products テーブルに (仮想的に) 追加するだけであり、これにより自己結合がそれに一致するようになります。そのため、Lang_ID 3、4、および 5 の製品があった場合、これらすべての Descr が Lang_ID 3 に設定されたものに設定されます。

于 2012-07-11T07:45:19.910 に答える
1

これはどう?

UPDATE myTable dt1, myTable dt2 
SET dt1.Descr = dt2.Descr
WHERE dt1.Prod_ID=dt2.Prod_ID;

sqlfiddle でのデモ

于 2012-07-11T08:09:04.253 に答える
0

Lang_ID が最小値を持つ同じ Prod_ID を持つ行のグループの行に正しい説明が常にあると仮定すると、この MySQL クエリは機能するはずです。

UPDATE your_table AS t1
    JOIN (
        SELECT Prod_ID, Descr
        FROM (
            SELECT *
            FROM your_table
            ORDER BY Lang_ID
        ) AS t3
        GROUP BY Prod_ID
    ) AS t2
    ON t1.Prod_ID = t2.Prod_ID
SET t1.Descr = t2.Descr;

上記は、Lang_ID が主キーまたは一意のキーである場合などに使用できます。対応する Lang_ID の最小値が常に同じ (例 = 1) の場合にも機能しますが、その場合は、このようなより単純なクエリが可能です。

于 2012-07-10T16:11:13.857 に答える