Tabel UPDATE berdasarkan tabel yang sama

12

Saya memiliki tabel dengan deskripsi produk, dan setiap deskripsi produk memiliki a product_iddan a language_id. Yang ingin saya lakukan adalah memperbarui semua bidang dengan language_iddari 2untuk menjadi sama dengan sama product_iddi mana language_idadalah 1.

Sejauh ini saya sudah mencoba query berikut, tetapi saya mendapatkan kesalahan yang menunjukkan bahwa MySQL tidak ingin memperbarui tabel di mana tabel tersebut juga digunakan dalam subquery.

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

Apakah ada cara "sederhana" untuk mengatasi keterbatasan ini di MySQL? Atau "trik" apa saja? Saya sedikit terkejut bahwa permintaan saya tidak berfungsi, karena tampaknya masuk akal.

nathangiesbrecht
sumber

Jawaban:

19

Ini adalah bisnis yang agak berisiko, dan saya bisa mengerti mengapa. Ini ada hubungannya dengan cara MySQL memproses subqueries. Saya menulis tentang hal itu kembali pada 22 Februari 2011: Masalah dengan subquery MySQL

Melakukan JOINs yang melibatkan SELECT dan subquery SELECT tidak masalah. Di balik semua hal, UPDATE dan DELETE bisa menjadi petualangan yang menantang kematian.

SARAN

Coba refactoring kueri sehingga itu adalah GABUNGAN INNER dari dua tabel

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;

Cobalah !!!

RolandoMySQLDBA
sumber
0

Yah ini tidak bekerja untuk saya, pembaruan itu tidak terjadi meskipun ada baris yang cocok. Apa yang harus saya lakukan adalah membuat tabel lain sebagai subquery sehingga file sementara digunakan.

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;
Galvani
sumber
-3
  1. Pertama-tama buat tabel view / temp dengan pernyataan pilih
  2. Jalankan permintaan pembaruan dengan gabung dalam
Sankar Kodali
sumber
2
Mungkin Anda dapat meningkatkan jawabannya dengan beberapa kode sampel?
ypercubeᵀᴹ