使用IN子句和子查询进行MySQL更新

时间:2013-12-04 02:40:50

标签: mysql sql

我想在我的MySQL数据库上运行一些更新。这是我想要使用的查询:

UPDATE `wphh_wp_eStore_tbl` 
SET `wphh_wp_eStore_tbl`.description = '<div class="dwrp">
<h2>F. Locker $109.99</h2>
<h2>Nike Outlet $109.99</h2>
<h2>Ch. Sports $107.99</h2>
<h2>Hoopers Hookup $89.99</h2>
<h2 class="special">These prices as of 11/20/13</h2>'
WHERE `wphh_wp_eStore_tbl`.id in (
    SELECT `wphh_wp_eStore_tbl`.id FROM `wphh_wp_eStore_tbl` 
    INNER JOIN `wphh_wp_eStore_cat_prod_rel_tbl` 
        on `wphh_wp_eStore_cat_prod_rel_tbl`.prod_id = `wphh_wp_eStore_tbl`.id
    WHERE `wphh_wp_eStore_cat_prod_rel_tbl`.cat_id = 5
    )

这会产生以下错误:

  

#1093 - 您无法在FROM子句中为更新指定目标表'wphh_wp_eStore_tbl'

为什么呢?我知道在MSSQL中我可以这样做:

Update tableone 
set columnname = 'xxx' 
where id in (
    select id 
    from tableone 
    where category = 10)

它有效。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

简单的解决方案是将in列表括在一个额外的嵌套级别中。然后MySQL将实现数据:

UPDATE `wphh_wp_eStore_tbl` 
SET `wphh_wp_eStore_tbl`.description = '<div class="dwrp">
<h2>F. Locker $109.99</h2>
<h2>Nike Outlet $109.99</h2>
<h2>Ch. Sports $107.99</h2>
<h2>Hoopers Hookup $89.99</h2>
<h2 class="special">These prices as of 11/20/13</h2>'
WHERE `wphh_wp_eStore_tbl`.id in (
    select * from (SELECT `wphh_wp_eStore_tbl`.id FROM `wphh_wp_eStore_tbl` 
INNER JOIN `wphh_wp_eStore_cat_prod_rel_tbl` on                 `wphh_wp_eStore_cat_prod_rel_tbl`.prod_id = `wphh_wp_eStore_tbl`.id
WHERE 
`wphh_wp_eStore_cat_prod_rel_tbl`.cat_id = 5) t
    )

另一种方法是将joinupdate一起使用。

答案 1 :(得分:0)

我不是MySQL人,但你可以这样做吗?我也喜欢使用这些丑陋名称的表别名。

UPDATE `wphh_wp_eStore_tbl` e
inner join `wphh_wp_eStore_cat_prod_rel_tbl` ecpr
  on ecpr.prod_id = e.id
  and ecpr.cat_id = 5 
set e.description = 'Some Text To Update With'

在SQL Server中,“from”和联接在SET之后但是......显然不是mySQL中的情况。