Обновление MySQL Table A на основе значения из таблицы B, объединенного через таблицу пересечений C - PullRequest
1 голос
/ 30 марта 2012

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

1 Ответ

0 голосов
/ 30 марта 2012

Вы должны иметь предложение on с объединением таблицы writers и вашим subquery.

...