Aynı tabloyu temel alan UPDATE tablosu


12

Ürün açıklamaları içeren bir tablom var ve her ürün açıklamasında a product_idve a var language_id. Ne yapmak istediğiniz ile tüm alanları güncellemek olduğu language_idbir 2aynı eşit olacak şekilde product_idnerede language_idolduğunu 1.

Şimdiye kadar aşağıdaki sorguyu denedim, ancak MySQL, tablonun alt sorguda da kullanıldığı bir tabloyu güncellemek istemediğini belirten hatalar alıyorum.

UPDATE
  products_description AS pd
SET 
  pd.products_seo = (
    SELECT
      pd2.products_seo
    FROM 
      products_description AS pd2
    WHERE
        pd2.language_id = 1
    AND pd2.products_id = pd.products_id
  )
WHERE
  pd.language_id <> 1

MySQL'de bu sınırlamanın "basit" bir yolu var mı? Veya herhangi bir "hile"? Mantıksal göründüğü gibi, sorgumu çalışmıyor biraz şaşırdım.

Yanıtlar:


20

Bu oldukça riskli bir iş ve nedenini anlayabiliyorum. MySQL'in alt sorguları işleme biçimi ile ilgilidir. Geri 22 Şubat 2011 tarihinde yazdım: MySQL alt sorgu ile ilgili sorun

SELECT'ler ve alt sorgu SELECT'leri içeren JOIN'lerin gerçekleştirilmesi sorun yaratmaz. Nesnelerin tersine, UPDATE'ler ve DELETE oldukça ölümcül bir macera olabilir.

ÖNERİ

Sorguyu iki tablonun İÇ BİRLEŞMESİ olacak şekilde yeniden düzenlemeyi deneyin

UPDATE
    products_description pd INNER JOIN products_description pd2 ON
    (pd.products_id=pd2.products_id AND pd2.language_id=1 AND pd.language_id<>1)
SET pd.products_seo = pd2.products_seo;

Bir şans ver !!!


0

Bu benim için işe yaramadı, eşleşen satırlar olmasına rağmen güncelleme olmadı. Ne yapmalıyım geçici tablo kullanılır böylece alt tablo olarak diğer tablo oluşturmaktır.

UPDATE tmContact 
INNER JOIN (
SELECT par.id, IF (LENGTH(contact.dynamicValues) > LENGTH(par.dynamicValues), contact.dynamicValues, par.dynamicValues) upd FROM tmContact par
INNER JOIN tmContact contact ON par.id = contact.linkCompanyId AND contact.linkCompanyId IS NOT NULL
WHERE contact.id IS NOT NULL AND contact.dynamicValues <>  par.dynamicValues AND LENGTH(contact.dynamicValues) > LENGTH(par.dynamicValues)
) input ON input.id = tmContact.id
SET tmContact.dynamicValues = upd;

-2
update products_description pd1,
 (select products_seo from products_description where language_id = 1) pd2
set pd1.products_seo = p2.products_seo
where pd1.products_id = p2.products_id and pd1.language_id <> 1;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.