如何修复具有指定表两次错误的SQL查询

时间:2018-01-28 07:51:25

标签: mysql sql

我有这个问题:

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 个答案:

答案 0 :(得分:1)

您可以使用表名称的别名
 (根据你的建议,你也可以使用join而不是in)

  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

答案 1 :(得分: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)

答案 2 :(得分:0)

虽然这不是一个好的答案,但它是有效的,哈哈.. 选择 * 来自wp_postmeta 在哪里meta_key =' _test'   AND post_id IN(SELECT GROUP_CONCAT(post_id)FROM wp_postmeta                     其中meta_value = 8023)

答案 3 :(得分: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查询转换为类似optimization的查询。

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