在有subscriber_id
和letter_id
的表格中,订阅者可能订阅了多个字母。如果他们订阅了任何其他信件,我想取消订阅某人的信。我需要帮助构建查询。我之前看到过我可能称之为嵌套查询但我没有写过它们的经验。
我可以在PHP中通过首先查询来执行此操作:
SELECT subscriber_id FROM subscriptions WHERE letter_id=3
然后在结果上运行foreach并删除subscriber_id有多个匹配的位置,但我敢打赌,如果我只知道如何,MySQL可以更快地完成这项工作。
我试图在这里编写伪代码,但即便如此,我也会挂断。
如果有帮助,每行也有自己的ID。
答案 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);