MySQL统计同一字段不同状态的数据量
例:统计一个表中 用户总数,以及 状态=0,状态=1,状态=2,状态=3,状态=1或者=2的用户数量:
查询语句:
SELECT
COUNT(1) totalCount,
SUM(CASE WHEN u.`status` = 0 THEN 1 ELSE 0 END) zeroCount,
SUM(CASE WHEN u.`status` = 1 THEN 1 ELSE 0 END) oneCount,
SUM(CASE WHEN u.`status` = 2 THEN 1 ELSE 0 END) twoCount,
SUM(CASE WHEN u.`status` = 3 THEN 1 ELSE 0 END) threeCount,
SUM(CASE WHEN u.`status` = 1 or u.`status` = 2 THEN 1 ELSE 0 END) oneOrTwoCount
FROM
kd_user u;
查询结果:
说明:
- SUM() 函数就是对每个状态的总数进行统计;
- CASE WHEN u.status = 0 THEN 1 ELSE 0 END: 这段意思就是当状态等于0时,sum+1,否则sum+0,当前这条结束;
再来个开发过程中稍微复杂一点的:
需求:查询满足条件的用户里 每一个用户发布的不同类型的文章数量
mybatis-plus中的查询:
<select id="ContentCount" resultType="ContentCountDTO">
SELECT
a.user_id,
SUM(CASE WHEN a.`type` = 1 THEN 1 ELSE 0 END) ugc_count,
SUM(CASE WHEN a.`type` = 2 THEN 1 ELSE 0 END) pgc_count
FROM kd_article a
WHERE a.status = 2
AND a.user_id IN
<foreach collection="userIds" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
GROUP BY a.user_id
</select>
说明:查询每一个满足条件的用户,就in满足条件的用户id,然后以用户id作为分组查询,不同的状态就去sum不同的type,很容易理解;