如果在另一行中找到id,则MySQL删除行

时间:2013-10-03 19:14:08

标签: php mysql sql-delete

在有subscriber_idletter_id的表格中,订阅者可能订阅了多个字母。如果他们订阅了任何其他信件,我想取消订阅某人的信。我需要帮助构建查询。我之前看到过我可能称之为嵌套查询但我没有写过它们的经验。

我可以在PHP中通过首先查询来执行此操作: SELECT subscriber_id FROM subscriptions WHERE letter_id=3 然后在结果上运行foreach并删除subscriber_id有多个匹配的位置,但我敢打赌,如果我只知道如何,MySQL可以更快地完成这项工作。

我试图在这里编写伪代码,但即便如此,我也会挂断。

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

4 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:0)

我希望你问这样的事,

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