[英]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 found
为2000-01-04
, 2000-01-08
使用WHERE itemCoupon = 'yes' OR itemReturned = 'yes'
。 如果我尝试以其他方式进行操作,则删除WHERE
为所有品牌提供零。
基本上,我想保持WHERE
行为方式,但也要保持我在预期输出的第一个示例中描述的格式。
现在,使用WHERE
会破坏最后一个LEFT JOIN
与COALESCE
工作的方式,该方法将用零填充其余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.