2013-10-03 33 views
3

在有subscriber_idletter_id的表中,用戶可能訂閱了多個字母。如果他們訂閱了任何其他信函,我想取消訂閱某封信中的人員。我需要幫助建立一個查詢。我已經看過我可能稱之爲嵌套查詢的內容,但我沒有經驗寫它們。如果在另一行發現了id,MySQL刪除行

我可能做到這一點在PHP中,首先查詢,如: SELECT subscriber_id FROM subscriptions WHERE letter_id=3 然後對結果運行的foreach,並刪除其中一個subscriber_id有一個以上的比賽,但我敢打賭MySQL能夠做到這一點快了很多,如果我只知道如何。

我試圖在這裏編寫僞代碼,但即使如此,我也掛掉了。

如果有幫助,每行也有自己的ID。

+0

誠實和良好的措辭問題值得回答;-)不幸的是我不知道如何(還),但我我肯定有人會友善地幫忙。 –

+0

如果他們不能訂閱超過一個,你應該有一個唯一的關鍵(subscriber_id,letter_id),那麼問題可能永遠不會出現 – 2013-10-03 19:18:04

+0

@Dagon,他們可以訂閱多個字母。這封信是個例外。這太籠統了。一旦他們至少訂閱了一封特定的信件,我需要將它們從通用信件中刪除。數據庫是應用程序的一部分,我的腳本以開發人員可能沒有想到的方式與它進行交互,所以我需要非常小心我所做的更改。 – TecBrat

回答

1

DELETE FROM subscriptions WHERE letter_id=3 AND subscriber_id IN (SELECT * FROM (SELECT subscriber_id FROM subscriptions WHERE letter_id<>3) AS x)

+1

**刪除 - 我無法指定目標表** http://stackoverflow.com/questions/5816840/delete-i-cant-specify-target-table –

+0

這看起來可能是正確的。我會仔細測試它,並讓你知道。 :) 謝謝。 – TecBrat

+1

@dianuj我確實得到了那個錯誤。感謝您的鏈接。我會看看我是否能使它工作。 – TecBrat

0

找出誰擁有一個以上的「其他」字母(在這種情況下letter_id 3)查詢是這樣的:

SELECT subscriber_id 
FROM subscriptions 
WHERE letter_id <> 3 
GROUP BY subscriber_id 
HAVING COUNT(*) > 1 

加入了此信息刪除查詢,添加letter_id = 3條件,和你應該所有設置:

DELETE FROM subscriptions 
INNER JOIN (
    SELECT subscriber_id 
    FROM subscriptions 
    WHERE letter_id <> 3 
    GROUP BY subscriber_id 
    HAVING COUNT(*) > 1 
) MoreThan1 ON subscriptions.subscriber_id = MoreThan1.subscriber_id 
WHERE letter_id = 3 
0

假設你的表中有一個主鍵(即id有自動遞增):

DELETE n1 FROM `table` n1, `table` n2 WHERE n1.id > n2.id AND n1.`field` = n2.`field` 

其中table是您的表名,field是要測試的字段。

我改編了我的查詢this answer。如果您的表沒有主ID表,則可以使用add it to an existing table

0

我希望你問這樣的事情,

DELETE FROM subscriptions 
WHERE subscriber_id = (SELECT subscriber_id FROM subscriptions WHERE letter_id=3); 
+0

**刪除 - 我無法指定目標表** http://stackoverflow.com/questions/5816840/delete-i-cant-specify-target-table –