我正在尝试为这些简化的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
);

10-05 21:08
查看更多