我正在尝试为包含视频频道和这些频道订阅者详细信息的表的MySQL数据库设置一些查询。其中一个查询尝试列出所有现有频道以及任何订户访问每个频道的次数。在这个查询中,我不感兴趣的是哪个用户访问了一个频道,而只是所有频道的列表和每个频道的访问总时间。这可能是一个非常简单的查询,但我刚开始玩数据库,所以请不要爆炸我。 为此,我使用了两个表(简称):
CREATE TABLE channels (channel_id, channel_name, channel_descr);
CREATE TABLE channel_accesses (channel_id, subscriber_id, access_date, num_of_accesses);
我尝试从“频道”表格中选择所有channel_ids和名称,count()
或sum()
num_of_accesses
channel_access
选择所有频道列表和名称,但我想出了一些有趣的结果因为我实际上不知道如何正确地把两者放在一起。在表channel_accesses
中,num_of_accesses
存储订户访问特定频道的次数。所以我需要的是以某种方式总计任何订阅者访问频道的次数(对不起,我想我在这里重复了一遍)。
答案 0 :(得分:2)
这是一个非常简单的查询:
首先使用外键列(FROM
)加入channel_id
子句中的两个表。我们需要使用LEFT JOIN
所以所有频道都出现在结果集中,即使那些没有订阅者和访问权限的频道也是如此。
FROM
channels AS c
LEFT JOIN
channel_accesses AS ca
ON ca.channel_id = c.channel_id
然后我们按channels
的主键分组,因为我们想要每个频道的结果:
GROUP BY
c.channel_id, c.channel_name
最后,我们可以SELECT
channels
我们想要的列SUM
和num_of_accesses
COALESCE()
的聚合。添加了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 ;
函数,因此对于没有订阅者的频道,我们得到0而不是空值:
{{1}}