在多个表中查找最活跃的视频制作者(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 by
和 limit
就足够了。
一个选项是使用计算每个制造商的视频计数的相关子查询进行排序:
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
)
如何仅使用一个查询就可以找到最活跃的视频制作者的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 by
和 limit
就足够了。
一个选项是使用计算每个制造商的视频计数的相关子查询进行排序:
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
)