【问题标题】:MySQL delete row if id is found in another row如果在另一行中找到 id,则 MySQL 删除行
【发布时间】:2013-10-10 15:14:57
【问题描述】:

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

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

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

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

【问题讨论】:

  • 一个诚实且措辞得体的问题值得回答 ;-) 不幸的是,我(目前)还不知道如何回答,但我相信有人会很乐意提供帮助。
  • 如果他们不能订阅多个,你应该在 (subscriber_id,letter_id) 上有一个唯一的键,那么问题就不会出现
  • @Dagon,他们可以订阅多个信件。这封信是个例外。太笼统了。一旦他们订阅了至少一封特定的信件,我需要将它们从一般信件中删除。数据库是应用程序的一部分,我的脚本正在以一种开发人员可能没有预料到的方式与之交互,所以我需要非常小心我所做的更改。

标签: php mysql sql-delete


【解决方案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)

【讨论】:

  • 删除 - 我无法指定目标表 stackoverflow.com/questions/5816840/…
  • 这看起来可能是正确的。我会仔细测试并告诉你。 :) 谢谢。
  • @dianuj 我确实得到了那个错误。感谢您的链接。我会看看我能不能让它工作。
  • 我并没有完全理解为什么,但是如果您将子查询包装在 (select * fromas x) 中,那么它可以工作。
【解决方案2】:

我希望你问这样的问题,

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

【讨论】:

【解决方案3】:

假设您的表有一个主键(即 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

【讨论】:

    【解决方案4】:

    找出谁有多个“其他”字母(在本例中为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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-15
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      • 2021-01-21
      • 1970-01-01
      • 2021-04-21
      • 2019-05-31
      相关资源
      最近更新 更多