Я уже некоторое время путаюсь с использованием MySQL, но до сих пор он еще не «в моем мозгу», поэтому я надеюсь, что смогу сделать я понял здесь, и что кто-то еще может помочь мне очистить эту особую мозговую грязь. :-)Обновление таблицы MySQL A на основе значения из таблицы B, соединенной с помощью перекрестка. Таблица C
У меня есть две таблицы MySQL, writers
и abstracts
, а таблица пересечений writer_abstract
, которая объединяет их в отношениях «многие ко многим».
В таблице abstracts
есть поле accepted
(boolean), чтобы указать, был ли принят определенный абзац для публикации. Аналогично, в таблице 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
). Но это не может быть что-то, что не так легко сделать, конечно ?!
Любая помощь очень ценится! :-)
Update
На основании ответа зимородка, вот версия, что на самом деле то, что я хотел (обратите внимание на RIGHT JOIN
вместо LEFT JOIN
-The бывшие естественно, затронули все строки в writers
, что WASN» т, что я хотел):
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
Возможно, вам не нужен столбец 'id' в таблице' writer_abstract'. Просто используйте идентификатор записи и абстрактный идентификатор вместе в качестве первичного ключа. – Wyzard
Да, этот столбец в основном просто там, потому что мне нравится иметь автоинкрементный столбец «id» во всех моих таблицах. Пойдите ОКР. :-) –
Это называется [суррогатным ключом] (https://en.wikipedia.org/wiki/Surrogate_key), и это имеет смысл во многих случаях. Но для таблицы типа 'writer_abstract', которая просто связывает две другие таблицы, она полностью избыточна, потому что два других столбца (которые соответствуют суррогатным ключам в других таблицах) уже однозначно идентифицируют запись. – Wyzard