我正在尝试为这些简化的MySQL表建立查询:
==campaigns==
id
content
==lists==
id
name
==subscriptions==
id
list_id
subscriber_id
==events==
id
campaign_id
list_id
subscription_id
==triggers==
id
campaign_id
list_id
time_to_send
我想找到所有订阅的subscription_id,而没有针对某个campaign_id的相应事件。
该查询返回所有订阅而没有事件:
SELECT *FROM subscriptions AS sLEFT JOIN events AS eON s.id = e.subscription_idWHERE e.subscription_id IS NULL
但是,我想返回所有订阅,要么没有特定活动的事件,要么没有特定触发器的事件。
我该怎么做?
最佳答案
但是,我想退回所有订阅,而没有针对特定广告系列的事件
由于订阅和活动之间的关系是由事件定义的,因此这是不可能的。
因此,事件表中可能有一个我们发送了广告系列#1的条目,但是我们想知道此订阅是否曾经专门发送过广告系列#2
如果要确定与广告系列1相关但与广告系列2没有相关的订阅,那么这是一个完全不同的问题。
SELECT s.*
FROM subscriptions s
INNER JOIN events e
ON s.id=e.subscription_id
INNER JOIN campaigns c
ON e.campaign_id=c.id
WHERE c.content='campaign #1'
AND NOT EXISTS (
SELECT 1
FROM events e2
INNER JOIN capaigns c2
ON e2.campaign_id=c2.id
WHERE c2.content='campaign #2'
AND e2.subscription_id=e.subscription_id
);