我有两张桌子
1-优惠券
2-牵引力
对于每一张优惠券,我希望在不同的条件下,拥有所有优惠券的列表和它的牵引符的计数。
SELECT `coupons`.`id` ,
count( tractions_all.id ) AS `all` ,
count( tractions_void.id ) AS void,
count( tractions_returny.id ) AS returny,
count( tractions_burned.id ) AS burned
FROM `coupons`
LEFT JOIN `tractions` AS `tractions_all`
ON `coupons`.`id` = `tractions_all`.`coupon_parent`
LEFT JOIN `tractions` AS `tractions_void`
ON `coupons`.`id` = `tractions_void`.`coupon_parent`
AND `tractions_void`.`expired` =1
LEFT JOIN `tractions` `tractions_returny`
ON `tractions_returny`.`coupon_parent` = `coupons`.`id`
AND `tractions_returny`.`expired` =11
LEFT JOIN `tractions` `tractions_burned`
ON `tractions_burned`.`coupon_parent` = `coupons`.`id`
AND `tractions_burned`.`expired` =0
AND '2014-02-12'
WHERE `coupons`.`parent` =0
GROUP BY `coupons`.`id`
现在只有我的一张优惠券有2
牵引力,两者都是burned traction
,其他的优惠券根本就没有牵引力。
这是结果
如你所见,与id=13
的优惠券有4牵引力,而它应该是2.我做错什么了?如果我移除最后一个联接,它可以正常工作,我得到2。
发布于 2014-02-12 14:04:42
你在同一时间沿着多个维度聚集,导致每个id的笛卡儿积。
如果您的数据量不是很大,那么最简单的解决方法就是使用distinct
SELECT `coupons`.`id` ,
count(distinct tractions_all.id ) AS `all` ,
count(distinct tractions_void.id ) AS void,
count(distinct tractions_returny.id ) AS returny,
count(distinct tractions_burned.id ) AS burned
如果您的数据很大,那么您可能需要先将值聚合为子查询,然后再进行联接。
https://stackoverflow.com/questions/21730123
复制相似问题