Bảng CẬP NHẬT dựa trên cùng một bảng


12

Tôi có một bảng với các mô tả sản phẩm và mỗi mô tả sản phẩm có một product_idvà a language_id. Những gì tôi muốn làm là cập nhật tất cả các lĩnh vực với một language_idsố 2được bình đẳng với cùng product_idnơi language_id1.

Cho đến nay tôi đã thử truy vấn sau đây, nhưng tôi gặp lỗi cho thấy MySQL không muốn cập nhật bảng trong đó bảng cũng đang được sử dụng trong truy vấn con.

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

Có cách nào "đơn giản" xung quanh giới hạn này trong MySQL không? Hoặc bất kỳ "thủ thuật" nào? Tôi hơi ngạc nhiên khi truy vấn của tôi không hoạt động, vì nó có vẻ hợp lý.

Câu trả lời:


19

Đây là kinh doanh khá rủi ro, và tôi có thể hiểu tại sao. Nó phải làm với cách MySQL xử lý các truy vấn con. Tôi đã viết về nó vào ngày 22 tháng 2 năm 2011: Vấn đề với truy vấn con của MySQL

Thực hiện THAM GIA liên quan đến CHỌN và CHỌN truy vấn con là OK. Trên đỉnh của sự vật, CẬP NHẬT và XÓA có thể là một cuộc phiêu lưu khá bất chấp cái chết.

GỢI Ý

Hãy thử cấu trúc lại truy vấn sao cho nó là THAM GIA VÀO hai bảng

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;

Hãy thử một lần !!!


0

Chà, điều này không hiệu quả với tôi, bản cập nhật chỉ không xảy ra mặc dù có các hàng khớp. Những gì tôi phải làm là tạo bảng khác dưới dạng truy vấn con để tập tin tạm thời được sử dụng.

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. Đầu tiên tạo bảng xem / temp với câu lệnh select
  2. Chạy truy vấn cập nhật với tham gia bên trong

2
Có lẽ bạn có thể cải thiện câu trả lời với một số mã mẫu?
ypercubeᵀᴹ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.