อัปเดตตารางตามตารางเดียวกัน


12

ฉันมีตารางมีรายละเอียดสินค้าและรายละเอียดของสินค้าแต่ละคนมีและproduct_id language_idสิ่งที่ฉันต้องการจะทำคือการปรับปรุงเขตข้อมูลทั้งหมดที่มีlanguage_idของ2ให้เท่ากับเดียวกันproduct_idที่เป็นlanguage_id1

จนถึงตอนนี้ฉันได้ลองใช้แบบสอบถามต่อไปนี้ แต่ฉันได้รับข้อผิดพลาดที่ระบุว่า MySQL ไม่ต้องการอัปเดตตารางที่มีการใช้ตารางในแบบสอบถามย่อยด้วย

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? หรือ "ลูกเล่น"? ฉันแปลกใจเล็กน้อยที่แบบสอบถามของฉันไม่ทำงานตามที่คิด

คำตอบ:


19

นี่เป็นธุรกิจที่ค่อนข้างเสี่ยงและฉันเข้าใจได้ว่าทำไม มันเกี่ยวข้องกับวิธีที่ MySQL ประมวลผลคิวรีย่อย ฉันเขียนถึงมันในวันที่ 22 กุมภาพันธ์ 2011: ปัญหาเกี่ยวกับแบบสอบถามย่อย MySQL

ดำเนินการเข้าร่วมที่เกี่ยวข้องกับการเลือกและแบบสอบถามย่อยที่ถูกเลือก ในส่วนของสิ่งต่าง ๆ UPDATEs และ DELETE สามารถเป็นการผจญภัยที่ท้าทายความตาย

ข้อเสนอแนะ

ลองปรับโครงสร้างแบบสอบถามอีกครั้งเพื่อให้เข้าร่วมภายในของสองตาราง

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;

ให้มันลอง !!!


0

อย่างนี้ไม่ได้ผลสำหรับฉันการอัพเดทก็ไม่ได้เกิดขึ้นแม้ว่าจะมีแถวที่ตรงกัน สิ่งที่ฉันต้องทำคือสร้างตารางอื่นเป็นแบบสอบถามย่อยเพื่อใช้ไฟล์ชั่วคราว

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;

-3
  1. ขั้นแรกให้สร้างตารางมุมมอง / อุณหภูมิที่มีคำสั่งเลือก
  2. เรียกใช้คิวรีอัปเดตด้วยการเข้าร่วมภายใน

2
บางทีคุณสามารถปรับปรุงคำตอบด้วยรหัสตัวอย่างได้ไหม?
ypercubeᵀᴹ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.