连接表并返回每条记录的匹配总数

时间:2014-03-15 14:53:24

标签: mysql

我有以下两个表:

操作:

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中是否可行?

1 个答案:

答案 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;

在某些情况下,这可以有更好的表现。