我有这个问题:
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
)`
答案 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