2012-03-30 2 views
1

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

Возможно, вам не нужен столбец 'id' в таблице' writer_abstract'. Просто используйте идентификатор записи и абстрактный идентификатор вместе в качестве первичного ключа. – Wyzard

+0

Да, этот столбец в основном просто там, потому что мне нравится иметь автоинкрементный столбец «id» во всех моих таблицах. Пойдите ОКР. :-) –

+0

Это называется [суррогатным ключом] (https://en.wikipedia.org/wiki/Surrogate_key), и это имеет смысл во многих случаях. Но для таблицы типа 'writer_abstract', которая просто связывает две другие таблицы, она полностью избыточна, потому что два других столбца (которые соответствуют суррогатным ключам в других таблицах) уже однозначно идентифицируют запись. – Wyzard

ответ

0

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

+0

О, д'о! Но, конечно, даже я должен был сразу это увидеть. Большое вам спасибо за доказательство, что я не схожу с ума, только слишком поздно! –

Смежные вопросы