我有以下两个表:
操作:
id | action
---|--------
1 | Some action
2 | Another action
3 | And another
和CompletedActions:
id | userid | actionid
---|--------|---------
1 | 4 | 1
2 | 4 | 2
3 | 4 | 2
4 | 4 | 2
5 | 5 | 1
并希望在给定的userid上加入它们,然后返回所有操作以及用户完成返回表的操作的次数,如下所示,使用userid = 4作为示例:
id | action | times
---|----------------|-------
1 | Some action | 1
2 | Another Action | 3
3 | And Another | 0
这在MySQL中是否可行?
答案 0 :(得分:2)
这是一个基本的join
/聚合查询,略有不同:
select a.id, a.action, count(ca.userid) as times
from Actions a left outer join
CompletedActions ca
on ca.actionid = a.id and
ca.userid = 4
group by a.actionid;
稍微扭曲是使用left outer join
来确保所有操作都包含在结果中。
顺便说一下,您也可以使用相关子查询来编写它:
select a.*,
(select count(*)
from CompletedActions ca
where ca.actionid = a.id and
ca.userid = 4
) as times
from actions a;
在某些情况下,这可以有更好的表现。