Я некоторое время ломал голову над использованием 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