sql - 加入两个包含csv文件的表进行查询
问题描述
我有两个 csv 文件,一个是关于艺术家的,一个是关于 Billboard 100 歌曲的,看起来像这样:
艺术家(前 4 行)
广告牌(第一行)
现在我必须编写一个 SQL 查询来打印每个艺术家以及他们发布的专辑数量和他们拥有的 Billboard100 歌曲的数量,这需要我加入这两个表。我的两个表的架构如下所示:
CREATE TABLE Artist(Artist_ID int not null primary key,
Artist varchar(30), Followers int,
Genres varchar(200), NumAlbums int,
YearFirstAlbum int, Gender char(1),
Group_Solo varchar(5) );
CREATE TABLE Billboard(Song_ID int not null primary key,
Artists varchar(90), Name varchar(20),
Weekly_rank int, Peak_position int,
Weeks_on_chart int, Week Date, Date varchar(20),
Genre varchar(20), Writing_Credits varchar(20),
Lyrics varchar(10), Features varchar(20) );
这是我插入 csv 文件时前几行的结果:
现在您知道在我没有在 billboard 表中插入外键的情况下,查询每个艺术家的最佳方法是什么,以及他们发布的专辑数量以及他们拥有文件的 Billboard100 歌曲的数量?或者我应该修改我的架构?
提前致谢!
解决方案
我建议从 Billboard 中删除 Artist 并创建一个新表来保存艺术家和他们的歌曲(特别是考虑到艺术家可以独奏和组)。不建议在 SQL 的同一列中有多个值。此外,最好存储 id 而不是艺术家姓名本身。
您可以创建如下表:
CREATE TABLE Artist_Billboard
(Artist_id int,
Song_id int,
FOREIGN KEY(Artist_id) REFERENCES Artist(Artist_id),
FOREIGN KEY(Song_id) REFERENCES Billboard(Song_id))
一旦你创建了这个表,就很容易提取你需要的信息。你所要做的就是:
select a.Artist, NumAlbums, count(ab.artist_id) Billboard100
from Artist_Billboard ab
join Artist a on a.Artist_id = ab.Artist_id
group by a.Artist, NumAlbums
数据库小提琴:https ://dbfiddle.uk/?rdbms=sqlite_3.27&fiddle=a3e9ec59b590e2cbeea0668e2eac0bc1
更新以下评论中的问题: 我不确定我是否理解您的问题。如果您询问如何识别歌曲 ID 和艺术家 ID 并执行插入,请参阅https://dbfiddle.uk/?rdbms=sqlite_3.27&fiddle=973235257b17dff0900f8adfe6afcd6d
目前歌曲名称和艺术家名称是硬编码的。你将不得不做类似的事情。
推荐阅读
- angular - 如何在反应式表单内的 ng-select 中设置默认值
- javascript - 我希望条件只遍历映射函数而不是渲染部分
- authentication - Simplesamlphp 自动角色填充不起作用
- filter - 过滤数据年龄范围,以在 R 中的整个数据集中对同一个人进行多次或年度测量
- python - 提交按钮添加评论
- vis.js-network - Vis.js 中的 `configure` 对象中的 `filter` 对象是如何工作的?
- javascript - 如何解决 NextJs (Typescript) 中的类型问题?
- c# - Selenium 网络驱动程序 + C#
- arrays - 预期为“int **”,但参数的类型为“int (*)[3]”
- json - Swift:如何使用字典字典解码 JSON,每个键都是递增的数字值?