2017-02-09 35 views
1

我有幾個不同的網站,用戶可以訂閱我的簡報。我使用sendy作爲我的簡報,並且遇到了一些問題。 Sendy的數據庫結構允許相同的電子郵件地址在數據庫中多次。每封電子郵件都有自己的ID,唯一的ID和列表ID是問題的一部分。
當有人從不同的網站註冊時,他們會轉到不同的列表。
如果有人從一個List ID中取消訂閱,那麼該記錄會得到一個未取消的值'1'。我想在數據庫中將其電子郵件地址的所有實例更新爲值'0'(如果他們從不同站點註冊的話)到其電子郵件的所有實例都具有'1'
我已經看過以下答案,但似乎無法讓我的頭正確地包裹答案。
mysql - UPDATEing row based on other rows
Updating rows based on other rows in the same table
這是結構的一部分MySQL +根據一行的值更新行數

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

這是進出口尋找

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

什麼,我需要確定一個電子郵件地址有一個退訂的例子值爲'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 . ") 
";