MySQL查询计数,按类型包含子部分

MySQL查询计数,按类型包含子部分,mysql,Mysql,我想知道是否有人能帮上忙 我有下列表格 user_ids { uUID name } types { tUID name } activity { aUID user_id type_id date } 因此,用户将包含 uUID name 1 Bob 2 Mark 3 Peter 类型将是 tUID name 1 Baseball 2 Football

我想知道是否有人能帮上忙

我有下列表格

user_ids {
    uUID
    name
}

types {
    tUID
    name
}

activity {
    aUID
    user_id
    type_id
    date
}
因此,用户将包含

uUID    name
1       Bob
2       Mark
3       Peter
类型将是

tUID    name
1       Baseball
2       Football
3       Cricket
活动将是

aUID    user_id    type_id    date
1         1           2
2         1           2
3         1           3
4         2           1
5         2           3
6         2           1
7         3           3
8         3           3
9         3           3
现在我想得到的是下表

Name   Type      Count of type
Bob    Baseball  0
Bob    Football  2
Bob    Cricket   1
Mark   Baseball  2
Mark   Football  0
Mark   Cricket   1
Peter  Baseball  0
Peter  Football  0
Peter  Cricket   3
我可以用单个查询的每个用户id来实现这一点,但我想知道是否有办法用单个查询来实现这一点

谢谢


Martin

解决方案是使用
用户和
类型的
交叉连接,然后使用
活动的
左连接

select u.name as Name, t.name as Type, COUNT(a.aUID) as `Count of type`
from users u CROSS JOIN type t
    LEFT JOIN activity a ON a.user_id = u.uUID AND a.type_id = t.tUID

您只需留下联接类型和活动表,并按用户和类型分组:

select u.name as Name, t.name as Type, COUNT(a.user_id) as `Count of type`
from type t
left join activity a on t.tuid=a.type_id
left join users u on a.user_id = u.uUID
group by u.name, t.name
像这样试试

带零

SELECT X.Name ,X.Type,
SUM(CASE WHEN A.user_id IS NULL THEN 0 ELSE 1 END ) as `Count of type`
FROM
(
    SELECT T.Name AS Type,U.name AS NAME,U.uUID,T.tuid FROM types T,user_ids U
)X  LEFT JOIN activity A ON A.type_id = X.tuid AND A.user_id =X.uUID
GROUP BY X.Name ,X.Type
ORDER BY X.Name ,X.Type
SELECT U.name AS Name, 
       T.name AS Type, 
       SUM(CASE WHEN A.user_id IS NULL THEN 0 ELSE 1 END ) as `Count of type`
FROM types T
LEFT JOIN activity a on T.tuid=A.type_id
JOIN user_ids U on A.user_id = U.uUID
GROUP BY U.name, T.name
不带零

SELECT X.Name ,X.Type,
SUM(CASE WHEN A.user_id IS NULL THEN 0 ELSE 1 END ) as `Count of type`
FROM
(
    SELECT T.Name AS Type,U.name AS NAME,U.uUID,T.tuid FROM types T,user_ids U
)X  LEFT JOIN activity A ON A.type_id = X.tuid AND A.user_id =X.uUID
GROUP BY X.Name ,X.Type
ORDER BY X.Name ,X.Type
SELECT U.name AS Name, 
       T.name AS Type, 
       SUM(CASE WHEN A.user_id IS NULL THEN 0 ELSE 1 END ) as `Count of type`
FROM types T
LEFT JOIN activity a on T.tuid=A.type_id
JOIN user_ids U on A.user_id = U.uUID
GROUP BY U.name, T.name

如果用户没有做任何活动或只做了1,例如Peter Cricket 3,但没有其他操作,With zero语句似乎不会返回0。它将返回用户是否做了某些活动