微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

结合两个表的SQLite3查询COUNT

如何解决结合两个表的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 举报,一经查实,本站将立刻删除。