我已经迷惑了一段时间使用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

最佳答案

您应该具有on子句,并带有writers表和subquery的连接。

09-15 21:53