Как исправить SQL-запрос, в котором указана ошибка таблицы дважды

0

У меня есть этот запрос:

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
)'
Теги:

4 ответа

1
Лучший ответ

Вы можете использовать псевдоним для имени таблицы
(и в качестве предложения в вашем случае вы также можете использовать соединение, а не в)

  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
  • 0
    Привет, это прекрасно работает, но как я могу использовать это, если запрос ОБНОВЛЕНИЕ и SET? (Я обновил вопрос с моим кодом)
  • 0
    обновление ответа .. но помните, что менять вопрос после первого (правильного) ответа не справедливо .. ....
Показать ещё 4 комментария
0

Запрос 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
0

Хотя это не очень хороший ответ, но он эффективен, ха-ха.. SELECT * FROM wp_postmeta WHERE meta_key= '_test' AND post_id IN (SELECT GROUP_CONCAT (post_id) FROM wp_postmeta где meta_value = 8023)

  • 0
    Работает, но выполнение занимает более 10 секунд ...
0
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)
  • 0
    Работает, но как бы мне написать это для работы с обновлением / набором (см. «Похожий запрос» в вопросе)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню