3

在有 asubscriber_id和 a的表中letter_id的表中,订阅者可能订阅了多个字母。如果人们订阅了任何其他信件,我想取消他们对某封信件的订阅。我需要帮助构建查询。我以前见过我可能称之为嵌套查询的东西,但我没有编写它们的经验。

我可能可以通过首先在 PHP 中进行如下查询来做到这一点: SELECT subscriber_id FROM subscriptions WHERE letter_id=3 然后对结果运行 foreach 并删除subscriber_id 有多个匹配项的位置,但我敢打赌,如果我只知道如何做,MySQL 可以更快地做到这一点。

我试图在这里编写伪代码,但我什至挂断了电话。

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

4

4 回答 4

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)

于 2013-10-03T19:27:20.427 回答
0

我希望你问这样的问题,

DELETE FROM subscriptions 
WHERE subscriber_id = (SELECT subscriber_id FROM subscriptions WHERE letter_id=3);
于 2013-10-03T19:28:22.537 回答
0

找出谁有多个“其他”字母(在本例中为letter_id3)的查询如下所示:

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
于 2013-10-03T19:24:53.723 回答
0

假设您的表有一个主键(即id自动递增):

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

您的表名在哪里table,并且field是要测试的字段。

我根据这个答案调整了我的查询。如果您的表没有主 ID 表,您可以将其添加到现有表中

于 2013-10-03T19:25:21.637 回答