我已经习惯使用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
答案 0 :(得分:0)
您应该on
条加入writers
表和subquery
。