MySQl使用COUNT和CASE语句

Dol*_*rma -1 mysql sql

在我的mysql数据库中,我有instagram_actions_histories带有两个重要列的表as action_typeaction_name,现在我想使用count和case语句获取ids列的计数,例如:

等于和等于“喜欢” id时所有s的计数action_type1action_name

select `account_id`,

count(case when action_type = 1 and action_name='like' then id else 0 END) as `like`,
count(case when action_type = 1 and action_name='superLike' then id else 0 END) as `superLike`,
count(case when action_type = 2 then id else 0 END) as `follow`, 

from `instagram_actions_histories` 
where `instagram_actions_histories`.`account_id` in (1) 
group by `account_id`
Run Code Online (Sandbox Code Playgroud)

不幸的是我得到错误的结果,因为所有输出都是相同的,例如:

account_id  like    superLike    follow
1           1282    1282         1282
Run Code Online (Sandbox Code Playgroud)

正确的结果应该是:

account_id  like    superLike    follow
1           1282    20           10
Run Code Online (Sandbox Code Playgroud)

Tim*_*sen 5

您应该为一场比赛数1,NULL在没有一场比赛时数:

SELECT
    account_id,
    COUNT(CASE WHEN action_type = 1 AND action_name = 'like' THEN 1 END) AS `like`,
    COUNT(CASE WHEN action_type = 1 AND action_name = 'superLike' THEN 1 END) AS superLike,
    COUNT(CASE WHEN action_type = 2 THEN 1 END) AS follow
FROM instagram_actions_histories
WHERE account_id IN (1)
GROUP BY account_id;
Run Code Online (Sandbox Code Playgroud)

当前CASE表达式的逻辑存在的问题是COUNT将任何非null值都计为一个计数。因此,零也将被计算在内。

注意,您当前的逻辑本来可以SUM用来进行条件聚合,例如

SUM(CASE WHEN action_type = 1 AND action_name = 'like'
         THEN 1 ELSE 0 END) AS `like`
Run Code Online (Sandbox Code Playgroud)

在这种情况下,要关闭不匹配记录的汇总,实际上我们可以使用零,因为将零相加不会影响总和。