您在其他地方的评论中提到“master” 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
请注意,虽然它确实使用了子查询,但它并没有嵌套它们。子查询实质上只是向 products 表(实际上)添加了一个具有最低 Lang_ID 值的列,然后允许自连接匹配该列。因此,如果存在具有 Lang_ID 3、4 和 5 的产品,这会将所有产品上的 Descr 设置为为 Lang_ID 3 设置的任何内容。