У меня есть этот запрос:
SELECT *
FROM 'wp_postmeta'
WHERE 'meta_key' = '_test'
AND 'post_id' IN (SELECT post_id FROM 'wp_postmeta'
where meta_value = 8023)
Возвращает ошибку SQL:
Таблица "wp_postmeta" указывается дважды, как в качестве цели для "UPDATE", так и в качестве отдельного источника данных
Я прочитал другие ответы и попытался добавить еще один SELECT * FROM ( )
вокруг вспомогательного запроса, но не помог.
Я предполагаю, что мне нужна какая-то форма AS
здесь, но не могу определить точный код.
Вы можете переписать запрос в формате, который не приведет к ошибке?
То же самое для этого похожего запроса:
UPDATE wp_postmeta
SET meta_value = 5.55
WHERE meta_key = '_regular_price'
AND post_id IN (
SELECT post_id
FROM wp_postmeta
WHERE meta_value = 8023
)'
Вы можете использовать псевдоним для имени таблицы
(и в качестве предложения в вашем случае вы также можете использовать соединение, а не в)
SELECT a.*
FROM 'wp_postmeta' a
inner join 'wp_postmeta' b on a.'post_id = b.post_id
where a.'meta_key' = '_test'
and b.meta_value = 8023
В обновлении вы можете использовать соединение с подзапросом для обхода ограничений из-за действий обновления в той же таблице
UPDATE wp_postmeta a
inner join (
SELECT post_id
FROM wp_postmeta
WHERE meta_value = 8023
) t on a.'post_id = t.post_id and a.'meta_key' = '_test'
SET meta_value = 5.55
Запрос SELECT
отправленный в вопросе, эквивалентен этому:
SELECT p1.*
FROM 'wp_postmeta' p1
INNER JOIN 'wp_postmeta' p2 ON p1.'post_id' = p2.'post_id'
WHERE p1.'meta_key' = '_test'
AND p2.'meta_value' = 8023
Фактически, если выполняются некоторые условия, движок MySQL преобразует исходный запрос SELECT
в запрос, подобный этому, как оптимизация.
Этот запрос SELECT
можно легко изменить в желаемый запрос UPDATE
:
UPDATE 'wp_postmeta' p1
INNER JOIN 'wp_postmeta' p2 ON p1.'post_id' = p2.'post_id'
SET p1.'meta_values' = 5.55
WHERE p1.'meta_key' = '_test'
AND p2.'meta_value' = 8023
Хотя это не очень хороший ответ, но он эффективен, ха-ха.. SELECT * FROM wp_postmeta
WHERE meta_key
= '_test' AND post_id
IN (SELECT GROUP_CONCAT (post_id) FROM wp_postmeta
где meta_value = 8023)
SELECT * FROM wp_postmeta as wp_out
WHERE wp_out.meta_key = '_test'
AND wp_out.post_id IN
( SELECT wp_in.post_id
FROM wp_postmeta as wp_in
where wp_in.meta_value = 8023)