2014-09-24 76 views
0

我创建了一个查询,我相信,无论如何,我都会返回表1中的所有电子邮件地址。左连接逻辑不如预期

如果我去SELECT COUNT(email), COUNT(DISTINCT email) contacts.sid208我得到心目中200000 175000.

有了这个,用左联接从下面的查询结果的电子邮件的数量应该是一样的没有?

SELECT 
    COUNT(email), COUNT(DISTINCT email) 
FROM 
    (SELECT 
     co.email, 
      env.env_medium, 
      CAST(MIN(co.created) AS DATE) AS first_contact, 
      MIN(CASE 
       WHEN my.my_id = 581 THEN my.data 
      END) AS Created, 
      MIN(CASE 
       WHEN my.my_id = 3347 THEN my.data 
      END) AS Upgraded 
    FROM 
     contacts.sid208 co 
    LEFT JOIN contacts.my208 my ON co.id = my.eid 
    LEFT JOIN contacts.env208 env ON env.eid = co.id 
    WHERE 
     my_id = 581 OR my_id = 3347 
    GROUP BY email) b1 

但这里的结果,如果我坚持的东西相称,是150000,而150000

我希望的结果是175000.

我LEFT JOIN的理解是,从通讯录中的所有记录.sid208将被保留,无论它们是否出现在my208或env208中。

我的理解是否有缺陷?希望我的问题对民间人士有意义,如果有更多的信息可以补充,让我的问题更清楚地告诉我。

+2

什么表有字段,my_id? – 2014-09-24 16:09:19

+0

对不起,my208有这个字段my_id – 2014-09-24 16:58:21

回答

2

对于左连接,移动条件下的连接,以及:

SELECT 
    COUNT(email), COUNT(DISTINCT email) 
FROM 
    (SELECT 
     co.email, 
      env.env_medium, 
      CAST(MIN(co.created) AS DATE) AS first_contact, 
      MIN(CASE 
       WHEN my.my_id = 581 THEN my.data 
      END) AS Created, 
      MIN(CASE 
       WHEN my.my_id = 3347 THEN my.data 
      END) AS Upgraded 
    FROM 
     contacts.sid208 co 
    LEFT JOIN contacts.my208 my 
     ON co.id = my.eid 
     AND (my_id = 581 OR my_id = 3347) 
    LEFT JOIN contacts.env208 env ON env.eid = co.id 
    GROUP BY email) b1 

如果你不这样做,你会首先执行加入,从而从sid208,所有行不分,与缺少电子邮件的值为null。但是,然后在where子句中进行过滤,并且无论如何都会删除这些记录。

当你把所有这些条件的加盟,你会得到所有行,以及电子邮件只加入时,他们有匹配的联系人ID,和自己的ID或者是581或2247

+0

非常感谢你解决了我的问题。现在我想到它也是有道理的。再次感谢 – 2014-09-24 17:03:36