2012-03-30 21 views
1

私はしばらくの間MySQLを使用して混乱してきましたが、それでもまだ私の脳の中にはまだありません。私はここで理解し、他の誰かが私のこの特定の大脳ミルをクリアするのを助けることができる。 :-)テーブルBの値に基づくMySQLテーブルAの交点テーブルC

私は2つのMySQLテーブルwritersabstractsを持っており、それらは多対多の関係で結合する交差テーブルwriter_abstractです。

abstractsテーブルには、公開のために特定の要約が受け入れられているかどうかを示すフィールドaccepted(ブール値)があります。同様に、writersテーブルには、投稿者が公開された(または公開のために受け入れられた)ものがあるかどうかを示すフィールドpublished(ブール値)もあります。

交差テーブルは非常に単純です:自動インクリメントidフィールド、writer_idフィールド、およびabstract_idフィールドがあります。私は問題なしで交差テーブルを使用してwritersabstractsの間を行き来することができます。

要約が受け入れられるか拒否される場合、は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 
+0

おそらく 'writer_abstract'テーブルに' id'カラムは必要ありません。ライターIDと抽象IDを一緒にプライマリキーとして使用してください。 – Wyzard

+0

ええ、その列はほとんどすべてのテーブルに自動インクリメントの 'id'カラムを持つのが好きです。 OCDに進んでください。 :-) –

+0

これは[代理キー](https://en.wikipedia.org/wiki/Surrogate_key)と呼ばれ、多くの場合意味があります。しかし、2つの他のテーブルをリンクする 'writer_abstract'のようなテーブルの場合、他の2つのカラム(他のテーブルの代理キーに対応する)はすでに一意にレコードを識別しているため、完全に冗長です。 – Wyzard

答えて

0

あなたはwritersテーブルを結合し、あなたのsubqueryon句を持つ必要があります。

+0

ああ、そうだよ!しかし、もちろん、私はすぐにそれを見ていたはずです。私が狂っていないことを証明してくれてありがとう、あまりにも遅くなっちゃった! –

関連する問題