私はしばらくの間MySQLを使用して混乱してきましたが、それでもまだ私の脳の中にはまだありません。私はここで理解し、他の誰かが私のこの特定の大脳ミルをクリアするのを助けることができる。 :-)テーブルBの値に基づくMySQLテーブルAの交点テーブルC
私は2つのMySQLテーブルwriters
とabstracts
を持っており、それらは多対多の関係で結合する交差テーブルwriter_abstract
です。
abstracts
テーブルには、公開のために特定の要約が受け入れられているかどうかを示すフィールドaccepted
(ブール値)があります。同様に、writers
テーブルには、投稿者が公開された(または公開のために受け入れられた)ものがあるかどうかを示すフィールドpublished
(ブール値)もあります。
交差テーブルは非常に単純です:自動インクリメントid
フィールド、writer_id
フィールド、およびabstract_id
フィールドがあります。私は問題なしで交差テーブルを使用してwriters
とabstracts
の間を行き来することができます。
要約が受け入れられるか拒否される場合、はTRUE
またはFALSE
のいずれかに設定されます。
私は何をしたいのは、すべての行でwriters.published
を更新し、accepted
フィールドTRUE
である著者によるいかなる抄録があるかどうTRUE
に設定し、単一のMySQL文で、あります。しかし、私はそれを働かせるために文をどのように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の回答に基づいて、ここで実際に私が望んでいたバージョンは(「wasn代わりLEFT JOIN
-theかつての自然に影響を受けたすべての行writers
でのRIGHT JOIN
を、注意していますトン、私が何を望むか):
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
おそらく 'writer_abstract'テーブルに' id'カラムは必要ありません。ライターIDと抽象IDを一緒にプライマリキーとして使用してください。 – Wyzard
ええ、その列はほとんどすべてのテーブルに自動インクリメントの 'id'カラムを持つのが好きです。 OCDに進んでください。 :-) –
これは[代理キー](https://en.wikipedia.org/wiki/Surrogate_key)と呼ばれ、多くの場合意味があります。しかし、2つの他のテーブルをリンクする 'writer_abstract'のようなテーブルの場合、他の2つのカラム(他のテーブルの代理キーに対応する)はすでに一意にレコードを識別しているため、完全に冗長です。 – Wyzard