MySQL使用间接where语句更新多个表

时间:2015-05-20 17:57:58

标签: mysql wordpress

为了向您提供上下文,此问题存在于WordPress网站中,但与WP无关。

我实际上是在尝试更改绑定在一起的两个表中的值。

表#1是wp_term_taxonomy(特此TT),其中包含以下列:

term_taxonomy_id | term_id |分类|描述|父

以下语句正确更新TT.taxonomyTT.parent

UPDATE wp_term_taxonomy TT
SET 
    TT.taxonomy='industry',
    TT.parent=0
WHERE TT.taxonomy='project_categories' 
    AND TT.parent=276;

这会将taxonomy列更改为以前在特定父级下的任何内容的新值。

我需要做的是改变另一个与这个有关系的表。

它被称为wp_icl_translations(特此ICL),并且包含以下列:

translation_id | element_type | element_id | ...

这些表之间有两个交叉点:

  • TT.term_id是与ICL.element_id
  • 的交集
  • TT.taxonomy是与ICL.element_type的交集,其中ICL.element_type的值也以tax_为前缀。

我的期望是以下声明会更新:

  • TT.parent
  • TT.taxonomy
  • ICL.element_type

这是我尝试过的SQL语句

UPDATE wp_term_taxonomy TT, wp_icl_translations ICL
SET 
    TT.taxonomy='industry',
    TT.parent=0,
    ICL.element_type = 'tax_industry'
WHERE TT.taxonomy='project_categories' 
    AND TT.parent=276
    AND ICL.element_id=TT.term_taxonomy_id
    AND ICL.element_type='tax_project_categories';

我需要在where语句中检查ICL.element_idICL.element_type,因为不同的element_id可能会有重复的element_type个条目。

2 个答案:

答案 0 :(得分:1)

我认为这样可行。

UPDATE .wp_term_taxonomy TT
INNER JOIN .wp_icl_translations ICL ON ICL.element_id = TT.term_id
                                   AND ICL.element_type='tax_project_categories'
SET 
    TT.taxonomy='industry',
    TT.parent=0,
    ICL.element_type = 'tax_industry'
WHERE TT.taxonomy='project_categories' 
  AND TT.parent=276

答案 1 :(得分:1)

(正如我在你的问题评论中指出的那样,我不确定你在问什么问题。我只是猜测。)

听起来你想要一个像这样的连接谓词:

   ICL.element_type = CONCAT('tax_',TT.taxonomy)

如果要更新TT中的行,即使ICL中没有匹配的行,也可以使用外连接。 (如果情况并非如此,如果TT中存在匹配的行,您只想更新ICL中的行,只需删除LEFT关键字。)

例如:

UPDATE wp_term_taxonomy TT
  LEFT
  JOIN wp_icl_translations ICL
    ON ICL.element_type = CONCAT('tax_',TT.taxonomy)
   AND ICL.element_id   = TT.term_id

   SET TT.parent        = 0
     , TT.taxonomy      = 'industry'
     , ICL.element_type = CONCAT('tax_','industry')

 WHERE TT.taxonomy = 'project_categories' 
   AND TT.parent = 276