根据表B中通过交集表C连接的值更新MySQL表A.

时间:2012-03-30 00:43:54

标签: mysql join many-to-many intersection

我已经习惯使用MySQL一段时间了,但它仍然没有真正进入我的大脑,所以我希望我能让自己在这里理解,而其他人可以帮助我清除这个特殊的大脑我的泥潭。 : - )

我有两个MySQL表,writersabstracts,以及一个以多对多关系连接它们的交集表writer_abstract

abstracts表中,有一个字段accepted(一个布尔值)来表示某个摘要是否已被接受发布。类似地,在writers表中,有一个字段published(也是一个布尔值),表示作者是否已发布(或接受发布)。

交集表非常简单:它有一个自动递增的id字段,一个writer_id字段和一个abstract_id字段。我可以使用交集表在writersabstracts之间来回选择,没有问题。

当摘要被接受或拒绝时,abstracts.accepted设置为TRUEFALSE

我想要做的是,在单个MySQL语句中,更新所有行中的writers.published并将其设置为TRUE,如果该作者的accepted字段有任何摘要是TRUE。但我无法弄清楚如何用UPDATE语句来表达它。

我最大的努力是这样的:

UPDATE writers LEFT JOIN
    ( SELECT abstracts.id AS aid, abstracts.accepted AS aacc FROM writer_abstract
      LEFT JOIN abstracts ON writer_abstract.abstract_id = writers.id
      WHERE aacc = TRUE AND writers.id = writer_abstract.author )
AS res
SET published = TRUE

显然,这不起作用(我在SET published = TRUE附近的语法中有错误)。但这肯定不是那么容易做到的事情吗?!

任何帮助非常感谢! : - )

更新

根据KingFisher的回复,这是实际做了我想要的版本(注意RIGHT JOIN而不是LEFT JOIN - 前者自然影响writers中的所有行,这不是不是我想要的:

UPDATE writers RIGHT JOIN
    ( SELECT author, accepted FROM writer_abstract
      LEFT JOIN abstracts ON writer_abstract.abstract_id = writers.id
      WHERE accepted = TRUE )
AS res ON res.author = writers.id
SET published = TRUE

1 个答案:

答案 0 :(得分:0)

您应该on条加入writers表和subquery