如何解决结合两个表的SQLite3查询COUNT
我在尝试使查询按预期工作时遇到麻烦,我有两个表(名称和类)。名称包含两行(用户名和名称),类别包含三行(类,用户名和时间)。
我正在尝试提取用户名,名称和每个人教的课程数量(请参见下表),可以通过查看给定的“用户名”出现在“班级”表中的次数来确定。问题在于“名称”表中出现了一些用户名,但“类”表中却没有出现这些用户名,这些用户的计数应分配为“ 0”。还有一些用户出现在类表中,但没有出现在名称表中,这些用户仍应考虑在内,但其名称应为空值。
names table classes table
__________________ ________________________
|username | name | |class | username |time |
|ab | Ali | |xxx | ch |xxx |
|ch | Chi | |xxx | dd |xxx |
|dd | Dia | |xxx | ee |xxx |
etc...
desired output from query
__________________________________________
|username | name |number of classes taught|
|ab | Ali |0 |
|ch | Chi |1 |
|dd | Dia |3 |
|ee | null |5 |
etc....
SELECT
names.username,name,COUNT(*)
FROM
classes
INNER JOIN names ON
names.username = classes.username
GROUP BY
classes.username
ORDER BY
COUNT(*)
actual output from query
__________________________________________
|username | name |number of classes taught|
|ch | Chi |1 |
|dd | Dia |3 |
但是,这给了我一个输出,它不包括不教书的用户,也不包括没有真实姓名的用户。我不确定如何解决此问题,是否需要合并两个用户名行而不创建重复项?或类似的东西?
解决方法
如果要所有用户,请从用户表开始。如果您希望所有没有任何类的用户,请执行LEFT联接而不是INNER联接
SELECT
names.username,name,COUNT(*)
FROM
names
LEFT JOIN classes ON
names.username = classes.username
GROUP BY
classes.username
ORDER BY
COUNT(*)
,
您需要的是FULL OUTER
联接,SQLite不支持该联接,但可以使用LEFT
联接和UNION ALL
进行仿真,然后进行聚合:
select username,count(*) [number of classes taught]
from (
select n.username,n.name,c.class
from names n left join classes c
on c.username = n.username
union all
select c.username,c.class
from classes c left join names n
on c.username = n.username
where n.username is null
)
group by username,name
查看简化的demo。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。