在多个表中查找最活跃的视频制作者(SQLite)

Finding the most active video maker within multiple tables(SQLite)

如何仅使用一个查询就可以找到最活跃的视频制作者的initials,即制作视频最多的视频制作者(考虑下表)?

CREATE TABLE IF NOT EXISTS Videos (
    title TEXT PRIMARY KEY,
    video_description TEXT NOT NULL,
);

CREATE TABLE IF NOT EXISTS VideosMaker (
    full_name TEXT PRIMARY KEY NOT NULL,
    initials TEXT NOT NULL
);

CREATE TABLE IF NOT EXISTS VideosMaker_Videos (
    video_title TEXT NOT NULL,
    video_maker_name TEXT NOT NULL,

    PRIMARY KEY (video_title, video_maker_name),
    FOREIGN KEY (video_title) REFERENCES Videos(title),
    FOREIGN KEY (video_maker_name) REFERENCES VideosMaker(full_name)
);

注意: 保证只有一个 video_maker 贡献了最大数量的新闻条目。 对于这个问题,foreign_keys 是 ON

你不关心平局,所以 order bylimit 就足够了。

一个选项是使用计算每个制造商的视频计数的相关子查询进行排序:

select vm.initials
from videosmaker vm
order by (
    select count(*) 
    from videosmaker_videos vmv 
    where vmv.video_maker_name = vm.full_name
) desc limit 1

此查询应利用 videosmaker_videos(video_maker_name) 上的索引。

你也可以加入聚合子查询

select vm.initials
from videosmaker vm
inner join (
    select video_maker_name, count(*) cnt 
    from videosmaker_videos 
    group by video_maker_name
) vmv on vmv.video_maker_name = vm.full_name
order by vmv.cnt desc limit 1

您可以通过此查询获取制作视频最多的视频制作者的姓名:

SELECT video_maker_name
FROM VideosMaker_Videos
GROUP BY video_maker_name
ORDER BY COUNT(*) DESC LIMIT 1

要获取首字母,您必须将其用作 WHERE 子句中的子查询:

SELECT initials
FROM VideosMaker
WHERE full_name = (
  SELECT video_maker_name
  FROM VideosMaker_Videos
  GROUP BY video_maker_name
  ORDER BY COUNT(*) DESC LIMIT 1
)