SQL выбирает идентификатор, затем использует этот идентификатор в обновлении

#mysql #sql

#mysql #sql

Вопрос:

У меня есть два простых оператора sql, оба работают независимо, но я хотел бы объединить их вместе. У меня есть только артикул продукта, поэтому я пытаюсь получить post_id из артикула. Затем обновите количество акций на основе post_id

Это захватывает post_id

 Select post_id from wp_postmeta
where meta_value = 'xxxxxxx'
  

Это обновляет запасы

 UPDATE wp_postmeta
SET meta_value = 1000
WHERE meta_key = '_stock'
AND post_id = RESULT FROM SELECT
  

Я не могу просто обновить stock через sku, поскольку woocommerce хранит sku и stock как meta_key, так и meta_value.

Огляделся и увидел много вещей, связанных с обновлением выбранных строк, но я не пытаюсь этого добиться, я пытаюсь использовать результат выбора в обновлении.

В качестве альтернативы, это даже применимое приложение для SQL, у меня это работает, но просто возвращает результат выбора, сохраняя как переменную в php, а затем используя в инструкции update. Может быть, это правильно с архитектурной точки зрения?

Комментарии:

1. Пометьте свой вопрос базой данных, которую вы используете.

2. Этот вопрос не имеет ничего общего с PHP, поэтому, пожалуйста, не помечайте его как таковой.

3. Оба допустимых пункта, исправлены

Ответ №1:

В большинстве баз данных вы просто используете стандартный синтаксис SQL:

 UPDATE wp_postmeta
    SET meta_value = 1000
    WHERE meta_key = '_stock' AND
          post_id IN (SELECT post_id
                      FROM wp_postmeta
                      WHERE meta_value = 'xxxxxxx'
                     );
  

Единственная база данных, где это не работает, — это MySQL, которую, вероятно, вы используете. Для этого вам нужно явное JOIN :

 UPDATE wp_postmeta pm JOIN
       wp_postmeta pm2
       ON pm.post_id = pm2.post_id AND
          pm2.meta_value = 'xxxxxxx'
    SET meta_value = 1000
    WHERE pm.meta_key = '_stock' ;