2014-01-15 50 views
0

我试图建立这些简化MySQL表查询:MySQL的:查找记录,而不匹配(JOIN/IS NULL)

==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 s LEFT JOIN events AS e ON s.id = e.subscription_id WHERE e.subscription_id IS NULL

但是,我想回到所有订阅要么没有特定广告活动事件没有事件特定触发

我该怎么做?

+0

SELECT * FROM订阅为S LEFT JOIN事件E在s.id = E。 subscription_id INNER JOI N个广告系列ON e.campaign_id = campaigns.id WHERE(e.subscription_id IS NULL)AND(campaigns.id = ID)当然..? – adaam

+0

对不起,什么?该活动持有该活动。你怎么能有一个订阅_without_事件,但_with_一个活动? –

+0

您可以在特定订阅下发送多个广告系列。订阅可能立即发送一个活动(#1),但有一个不同的活动(#2)排队等待两天后发送。因此,我们发送了活动#1的活动表中可能会有一个条目,但我们想知道此订阅是否曾专门发送过活动#2。 – user3199785

回答

0

但是,我想没有一个事件返回所有订阅特定广告活动

由于由事件定义这是不可能的订阅和广告之间的关系。

所以,有可能是在我们发出竞选#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 
); 
+0

感谢您的回答!我只是修改了问题以包含'triggers'表。该表格具有在特定时间向哪个列表发送活动的规则。如果我将事件表修改为每个事件都有trigger_id,该怎么办?然后,在发送活动时,会记录“此触发器”(对应于某个列表和活动)创建“此事件”的事件?我可以做一个查询,说:“查找事件表中没有”触发器“事件的所有subscription_id? – user3199785

相关问题