繁体   English   中英

让JOIN和WHERE一起工作

[英]Getting JOIN and WHERE to work together

好的,我有一个带有以下信息和查询的示例表。 首先是数据,最后是问题。

这是SQL转储: http : //pastie.org/private/o7zzajdpm6lzcbqrjolgg

或者,您可以使用下面提供的视觉效果:

购买表

|  id   |   brand   |    date     |

    1        b1       2000-01-01 
    2        b1       2000-01-03 
    3        b2       2000-01-04
    4        b3       2000-01-08
    5        b4       2000-01-14

所有者表

id | firstname | lastname | purchaseid | itemCoupon | itemReturned | Accessories
 1     Jane        Doe          1           yes           no               4
 2     Jane        Doe          2           yes           no               2 
 3     Jane        Doe          3           no            no               1
 4     Jane        Doe          4           no            no               3
 5     Jane        Doe          5           no            yes              6

查询

SELECT brand, COALESCE( SUM( inTime.Accessories ) , 0 ) AS acessory_sum
FROM purchases
INNER JOIN owners AS person ON person.purchaseid = purchases.id
AND person.firstname =  'Jane'
AND person.lastname =  'Doe'
LEFT JOIN owners AS inTime ON person.id = inTime.id
AND purchases.date
BETWEEN DATE(  '2000-01-01' ) 
AND DATE(  '2000-01-05' ) 
GROUP BY purchases.brand

这给出了以下预期结果:

| brand | accessory_sum
   b1          6
   b2          1
   b3          0
   b4          0

问题

现在,我想添加到查询中:

WHERE itemCoupon = 'yes' OR itemReturned = 'yes'

但这会覆盖最后的联接,当我在上面进行相同的搜索时,我得到:

| brand | accessory_sum
   b1          6
   b2          1

同样地,我还是希望它返回No results found2000-01-042000-01-08使用WHERE itemCoupon = 'yes' OR itemReturned = 'yes' 如果我尝试以其他方式进行操作,则删除WHERE为所有品牌提供零。

基本上,我想保持WHERE行为方式,但也要保持我在预期输出的第一个示例中描述的格式。

现在,使用WHERE会破坏最后一个LEFT JOINCOALESCE工作的方式,该方法将用零填充其余brand行。

执行JOIN时的ON子句与WHERE子句相似。 因此,与其尝试使用WHERE,不如直接在查询中添加另一个AND(并且不要忘记在OR子句中使用括号):

SELECT brand, 
COALESCE(SUM(Time.purchasedAccessories),0) as acessory_sum
FROM purchases 
INNER JOIN owners AS person 
ON person.purchaseid = purchases.id 
AND person.firstname = 'Jane' 
AND person.lastname = 'Doe'

AND (person.itemCoupon = 'yes' OR person.itemReturned = 'yes')

LEFT JOIN owners AS inTime 
ON person.id= inTime.id 
AND purchases.date 
BETWEEN purchases.date 
DATE( '2000-01-01' )
AND 
DATE( '2000-01-05' ) 
GROUP BY purchases.brand

您的WHERE会将外部联接变成内部联接。

您需要将其他条件移到LEFT JOIN条件中:

LEFT JOIN owners as inTime 
       ON person.id = inTime.id 
      AND purchases.date between purchases.date DATE ('2000-01-01') and DATE ('2000-01-05')
      AND (inTime.itemCoupon = 'yes' or inTime.itemReturned = 'yes')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM