ОНОВЛЕННЯ таблиці на основі тієї ж таблиці


12

У мене є таблиця з описом товарів, і в кожному описі товару є " product_idа" language_id. Те , що я хочу зробити , це обновити всі поля з language_idпро 2рівному тому ж , product_idде language_idзнаходиться 1.

Поки я намагався наступний запит, але я отримую помилки, вказуючи на те, що 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

Виконання ПРИЄДНАННЯ із залученням SELECT і підзапиту SELECT в порядку. З іншого боку, ОНОВЛЕННЯ та ВИДАЛЕННЯ можуть бути досить пристрастю до смерті.

ПРОПОЗИЦІЯ

Спробуйте рефакторинг запиту, щоб він був ВНУТРІШНЬОМУ ПРИЄДНАННІ двох таблиць

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. Спочатку створіть таблицю перегляду / темп із оператором select
  2. Запустіть запит оновлення із внутрішнім з'єднанням

2
Можливо, ви можете покращити відповідь за допомогою якогось зразкового коду?
ypercubeᵀᴹ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.