JOIN - 排除第二个表中的所有值

时间:2013-02-13 05:30:30

标签: mysql

我有两个表,希望以这样的方式将它们连接在一起,以排除第二个表中的所有值。当我加入两个表时,我只想要表1中的值,并且不希望两个表中的值或表2中的值。

我认为这可以通过LEFT JOIN或LEFT OUTER JOIN完成,但我发现了一些奇怪的发现。

当我检查所有数据时,我有以下计数。

-- TOTAL LEADS: 10067
SELECT COUNT(*) FROM sold_leads AS sl 
WHERE sl.affiliate_id IN(1000,1001,1002,1033) 
AND sl.create_date >= '2013-1-1' 
AND sl.lead_type = 'AUTO'; 

但是,当我尝试仅查找表1中的值时,我发现更高的数字,这是不可能的。

 -- How many had No suspension/dui, sr22, and <=2 accidents AND <=2 tickets: 13931
 SELECT COUNT(*) FROM sold_leads AS sl
 INNER JOIN drivers AS dr ON sl.lead_id = dr.lead_id
 LEFT OUTER JOIN duis AS duis ON sl.lead_id = duis.driver_id
 LEFT OUTER JOIN accidents AS ac ON sl.lead_id = ac.driver_id  
 WHERE sl.affiliate_id IN(1000,1001,1002,1033)
 AND sl.create_date >= '2013-1-1'
 AND dr.relationship_type = 'SELF';

总计数不会低于我离开加入某些表并添加一些限制的计数。我做错了什么。

另外,我知道我没有提供架构,但我如何只选择&lt; = 2次事故。 有一个有一个driver_id的事故表,但是我玩了不同的HAVING(COUNT(*))且没有运气。

帮助!?

2 个答案:

答案 0 :(得分:2)

排除连接通常具有将结果限制为外连接表中不匹配的条件:

SELECT COUNT(*) FROM sold_leads AS sl
INNER JOIN drivers AS dr ON sl.lead_id = dr.lead_id
LEFT OUTER JOIN duis AS duis ON sl.lead_id = duis.driver_id
LEFT OUTER JOIN accidents AS ac ON sl.lead_id = ac.driver_id  
WHERE sl.affiliate_id IN(1000,1001,1002,1033)
AND sl.create_date >= '2013-1-1'
AND dr.relationship_type = 'SELF'
-- these are the exclusion join tests:
AND duis.driver_id IS NULL AND ac.driver_id IS NULL

@ConradFrix的评论也很好;如果drivers中每行sold_leads包含&gt; 1行,则可以获得乘法效果,因此最好返回COUNT(DISTINCT sl.something) 某些内容是独特的专栏。

我对你的加入条件也不太确定,你将duis.driver_id和ac.driver_id与sl.lead_id进行比较。但是dr.lead_id也与sl.lead_id进行了比较。这些条件中的一个或另一个是不正确的吗?当然,您比我更了解您的架构,但看起来列名不一致。

答案 1 :(得分:1)

如果driversduisaccidents包含多个具有相同lead_id的行,则您的结果将包含多个具有相同lead_id的行1}},您将增加总行数。你可能想把它添加到你的where子句:

AND     duis.lead_id IS NULL
AND     ac.lead_id IS NULL

如果您只希望在sold_leadsduis中没有匹配记录的accidents,那么使用NOT IN和子查询而不是使用子查询可能会更加清晰直接加入这些表。您可以在this question中看到一些示例和一些替代方案的讨论。