2017-02-09 15 views
1

ユーザーがニュースレターを購読できるサイトはいくつかあります。私のニュースレターにsendyを使っていて、何か問題がある。 Sendyのdb構造では、同じ電子メールアドレスを複数回使用することができます。各電子メールには、独自のID、一意のID、および問題の一部であるリストIDがあります。
誰かが別のサイトからサインアップすると、別のリストに移動します。
誰かが1つのリストIDから退会した場合、そのレコードはunsub値が '1'にな​​ります。 DB内のメールアドレスのすべてのインスタンスを '0'(異なるサイトからサインアップした場合)のメールのすべてのインスタンスに '1'を付けるように更新します。
次の回答を見ましたが私の頭が正しい答えの周りを包んでいるようには見えません。
mysql - UPDATEing row based on other rows
Updating rows based on other rows in the same table
これはこれは私がメールアドレスは配信停止を持っていることを決定する必要がImはMySQL + 1行の値に基づいて行を更新する

id email   list unsubscribed 
1 [email protected] 1 1 
2 [email protected] 2 0 
3 [email protected] 3 0 

を探しているものの一例である構造

Name Type   Attributes Null Default Extra 
id  int(11)  UNSIGNED  No  None AUTO_INCREMENT 
email varchar(100)    Yes  NULL  
list int(11)      Yes  NULL  

の一部です。値が「1」であれば、「0」を有するその電子メールアドレスの他のすべての発生は「1」に更新される。
これはPHPで行う必要がありますか、これをMySqlで自動化できますか?

答えて

3

unsubscribed = 1ですべての電子メールを検出するサブクエリを作成します。元のテーブルと結合して、同じ電子メールを持つ他のすべての行を探し、1に設定します。

UPDATE YourTable AS t1 
JOIN (SELECT DISTINCT email 
     FROM YourTable 
     WHERE unsubscribed = 1) AS t2 
ON t1.email = t2.email 
SET t1.unsubscribed = 1 
WHERE t1.unsubscribed = 0 
+0

は完璧に動作し、そんなにありがとう! – Semon

0

私の推測では、(私は穏やかな、このクエリをテストしていない)のようになります。

$query = "UPDATE `tablename` 
SET 
    unsubscribed = 1 
WHERE 
    email = (SELECT email from `tablename` WHERE id = " . $id . ") 
"; 
関連する問題