Mysql 如何计算通道访问的总数

Mysql 如何计算通道访问的总数,mysql,select,count,sum,Mysql,Select,Count,Sum,我试图为MySQL数据库中包含视频频道和这些频道订户详细信息的表设置一些查询。其中一个查询尝试列出所有现有频道以及任何订阅者访问每个频道的次数。在这个查询中,我不关心哪个用户访问了一个频道,只关心所有频道的列表以及每个频道访问的总次数。这可能是一个非常简单的查询,但我刚刚开始玩数据库,所以请不要烦我。 为此,我使用创建的两个表(简而言之): 我试图从“通道”表中选择所有通道ID和名称,并在channel\u access中选择count()或sum()访问的num\u,但我得到了一些有趣的结果,

我试图为MySQL数据库中包含视频频道和这些频道订户详细信息的表设置一些查询。其中一个查询尝试列出所有现有频道以及任何订阅者访问每个频道的次数。在这个查询中,我不关心哪个用户访问了一个频道,只关心所有频道的列表以及每个频道访问的总次数。这可能是一个非常简单的查询,但我刚刚开始玩数据库,所以请不要烦我。 为此,我使用创建的两个表(简而言之):


我试图从“通道”表中选择所有通道ID和名称,并在
channel\u access
中选择
count()
sum()
访问的
num\u
,但我得到了一些有趣的结果,因为我实际上不知道如何正确地将两者组合在一起。在表
channel\u accesss
中,
num\u of\u accesss
存储订户访问特定频道的次数。因此,我需要的是以某种方式合计任何订阅者访问频道的次数(对不起,我想我在这里重复了我自己)。

这是您需要的一个非常简单的查询:

首先使用外键列(
channel\u id
)将
FROM
子句中的两个表连接起来。我们需要使用
左连接
,这样所有频道都会显示在结果集中,即使是那些根本没有订户和访问的频道:

FROM
    channels AS c
  LEFT JOIN 
    channel_accesses AS ca
      ON ca.channel_id = c.channel_id
然后我们按
通道的主键进行分组
,因为我们需要每个通道的结果:

GROUP BY
    c.channel_id, c.channel_name
最后,我们可以
频道中选择所需的列以及聚合(
SUM
of
num\u of\u access
)。添加了
COALESCE()
函数,因此对于没有订阅者的频道,我们得到的是0而不是null:

SELECT 
    c.channel_id, 
    c.channel_name,
    COALESCE(SUM(ca.num_of_accesses), 0) AS total_num_of_accesses
FROM 
    channels AS c
  LEFT JOIN 
    channel_accesses AS ca
      ON ca.channel_id = c.channel_id
GROUP BY
    c.channel_id, c.channel_name ;

非常感谢y/cube提供的详细易懂的解释。这正是我需要的解释类型和建议的解决方案本身。这对我来说也是一种鼓励,因为我自己也离这不远了,除了少数例外,我的结果到处都是。再次感谢!++谢谢你的回答。对不起,我这边没有足够的声望去投票。
SELECT 
    c.channel_id, 
    c.channel_name,
    COALESCE(SUM(ca.num_of_accesses), 0) AS total_num_of_accesses
FROM 
    channels AS c
  LEFT JOIN 
    channel_accesses AS ca
      ON ca.channel_id = c.channel_id
GROUP BY
    c.channel_id, c.channel_name ;