我已经迷惑了一段时间使用MySQL,但是它仍然还不是真正地在我的大脑中,所以我希望我可以在这里让自己有所了解,并且其他人可以帮助我清除我这个特殊的大脑泥潭。 :-)
我有两个MySQL表writers
和abstracts
,以及一个交叉表writer_abstract
,它们以多对多关系连接它们。
在abstracts
表中,有一个字段accepted
(一个布尔值)指示是否已接受某个摘要的发布。类似地,在writers
表中,有一个字段published
(也是一个布尔值),它指示作者是否已发布(或接受发布)任何内容。
相交表非常简单:它具有一个自动递增的id
字段,一个writer_id
字段和一个abstract_id
字段。我可以使用交集表在writers
和abstracts
之间来回选择,而不会出现问题。
当摘要被接受或拒绝时,abstracts.accepted
设置为TRUE
或FALSE
。
我想做的是,在单个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
的连接。