InviteRewardDetailMapper.sql
<select id="listRewardStatistic" resultType="cn.jmfen.sport.activitycenter.invite.dto.RewardStatisticDto"parameterType="cn.jmfen.sport.activitycenter.invite.bo.InviteRewardSearchBo">SELECTtemp.from_uid as uid,temp.from_nickname as nickname,-- 注意这里的countcount(reward_type = 2 OR reward_type = 0 OR NULL) AS invite_num,sum(if(temp.from_uid = temp.reward_uid,reward_num,0)) AS reward_amountFROM(SELECTb.uid as reward_uid,a.from_uid,a.from_nickname,IF (b.create_time IS NULL,a.create_time,b.create_time) AS reward_time,IF (b.reward_type IS NULL,0,b.reward_type) AS reward_type,IF (b.reward_num IS NULL,0,b.reward_num) AS reward_numFROM jmf_invite_attend_detail aLEFT JOIN jmf_invite_reward_detail b ON a.id = b.aid) AS temp<where>temp.reward_time between #{searchBo.startTime} and #{searchBo.endTime}<if test="searchBo.user != null and searchBo.user!=''">and temp.from_uid like concat('%',#{searchBo.user},'%') or temp.from_nickname like concat('%',#{searchBo.user},'%')</if></where>GROUP BY temp.from_uid ORDER BY invite_num DESC</select>-- 如count(release_year = '2006' or NULL) 这部分为什么要加上or NULL,-- 直接count(release_year='2006')有什么问题吗,不就是要找release_year = '2006'的数据吗,为什么要计算NULL的数据-- 因为当 release_year不是 2006时 ,release_year='2006' 结果false 不是 NULL,Count在 值是NULL是 不统计数,-- (count('任意内容')都会统计出所有记录数,因为count只有在遇见null时不计数,-- 即count(null)==0,因此前者单引号内不管输入什么值都会统计出所有记录数)至于加上or NULL,-- 很像其他编程里的or运算符,第一个表达式是true就是不执行or后面的表达式,第一个表达式是false 执行or后面的表达式-- 当release_year不为2006时release_year = '2006' or NULL 的结果是NULL,Count才不会统计上这条记录数
