MySQL - ОБНОВЛЕНИЕ с ВНУТРЕННИМ ВЫБОРОМ - PullRequest
2 голосов
/ 15 февраля 2012

Я хочу сделать что-то подобное, но мне кажется, что я просто не могу:

UPDATE products p2
SET
manufacturer = 
(
SELECT manufacturer
FROM products p, manufacturers m, etc.
WHERE
...other stuff...
p.name LIKE CONCAT('%',m.name,'%')    
AND p.id = p2.id
)
WHERE manufacturer = 0

Ошибка: # 1093 - Вы не можете указать целевую таблицу 'p2' для обновления в FROM

Проблема в том, что у меня есть поле производителя в таблице, но некоторые имена производителей находятся в строке product_name-вместо поля производителя, поэтому мне нужно получить идентификатор производителя по имени-продукта иобновить таблицу продуктов с идентификатором производителя.

Я мог бы сделать это за два шага, но id хотел бы сделать это за один раз.

Ответы [ 4 ]

3 голосов
/ 15 февраля 2012

Попробуйте этот запрос -

UPDATE products p
  JOIN manufacturers m
    ON LOCATE(p.name, m.name) > 0
SET p.manufacturer = m.id;

... но сначала проверьте правильность соединения записей -

SELECT * FROM products p
  JOIN manufacturers m
    ON LOCATE(p.name, m.name) > 0 -- bind records in two tables
2 голосов
/ 15 февраля 2012

Комментарий относительно этой же ошибки в http://dev.mysql.com/doc/refman/5.0/en/subquery-errors.html говорит: «MySQL не позволяет ОБНОВИТЬ или УДАЛИТЬ данные таблицы, если вы одновременно читаете эти же данные с помощью подзапроса.»

0 голосов
/ 12 сентября 2014

Пример для одной таблицы, которая работает:

Этот оператор перемещает все AKTIV-записи в DEAKTIV, где уже существует соответствующая DRAFT-запись:

update table1 fa inner join table1 fe on (fa.datum = fe.datum and fa.firmenid = fe. firmenid and  fe.status = 'DRAFT')
set fa.status = 'DEACTIV'
where fa.firmenid = '+49151506292' and fa.status = 'ACTIV';

После выполнения оператора выше я простообновить DRAFT-записи для ACTIV и зафиксировать

0 голосов
/ 15 февраля 2012

Посмотрите, работает ли этот тип запроса для вас

UPDATE products p2 INNER JOIN manufacturers m ON m.product_id = p2.id AND p2.name LIKE CONCAT('%',m.name,'%') SET manufacturer = YOURVALUE

Возможно, вам придется изменить вышеуказанный запрос, как я написал на основании моего предположения

...