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。它将返回用户是否做了某些活动