我已经从Spotify下载了曲目信息,但很多歌曲都有多个版本,我想尝试合并。例如,在美国有Rihanna的“Love On The Brain”有6种不同的曲目记录。在这种情况下,我可以简单地比较曲目名称和艺术家ID,并确定它们都是(大致)相同的歌曲。然而,当一个曲目有几位艺术家时,它(我认为)变得更加困难。
我有三个表连接到此问题:轨道,其中包含每个轨道的行,其中包含一些我想要分析的有趣数据,艺术家,其中包含每个艺术家的行,以及Track_artists,其中包含每个轨道的行-artist对,具有自动递增的track_artist_id。所以对于歌曲工作,我有一个或多个Track行(取决于发行的数量),1个艺术家行为Rihanna和1个为Drake,然后对于Tracks中的每一行,Track_artists中有2行: 因此,以下查询给出了以下结果:
select ta.track_id, ta.artist_id, a.name
from track_artists ta inner join artists a on ta.artist_id=a.artist_id
inner join tracks t on t.track_id=ta.track_id
where t.name='Work';
+------------------------+------------------------+-------------+
| track_id | artist_id | name |
+------------------------+------------------------+-------------+
| 0ghpAAdn5OmxvI7ul5DR2B | 5pKCCKE2ajJHZ9KAiaK11H | Rihanna |
| 0ghpAAdn5OmxvI7ul5DR2B | 3TVXtAsR1Inumwj472S9r4 | Drake |
| 32lmL4vQAAotg6MrJnhlQZ | 5pKCCKE2ajJHZ9KAiaK11H | Rihanna |
| 32lmL4vQAAotg6MrJnhlQZ | 3TVXtAsR1Inumwj472S9r4 | Drake |
| 4aRD0bzvsBD0MAB4LcsRSM | 5pKCCKE2ajJHZ9KAiaK11H | Rihanna |
| 4aRD0bzvsBD0MAB4LcsRSM | 3TVXtAsR1Inumwj472S9r4 | Drake |
| 4m6D70k5xMmCDCB19u7Bi0 | 5pKCCKE2ajJHZ9KAiaK11H | Rihanna |
| 4m6D70k5xMmCDCB19u7Bi0 | 3TVXtAsR1Inumwj472S9r4 | Drake |
+------------------------+------------------------+-------------+
对我来说很明显,这些都是同一首歌,但是将它们分组的最佳方式是什么?我的解决方案是:
select t.track_id,t.name,a1.artist_id first_artist,a2.artist_id second_artist
from track_artists a1 inner join tracks t on t.track_id=a1.track_id
inner join track_artists a2 on t.track_id=a2.track_id
where t.name='Work' and
a1.artist_id = (select artist_id from track_artists where track_id = t.track_id limit 1) and
a2.artist_id = (select artist_id from track_artists where track_id = t.track_id limit 1,1);
+------------------------+------+------------------------+------------------------+
| track_id | name | first_artist | second_artist |
+------------------------+------+------------------------+------------------------+
| 0ghpAAdn5OmxvI7ul5DR2B | Work | 5pKCCKE2ajJHZ9KAiaK11H | 3TVXtAsR1Inumwj472S9r4 |
| 32lmL4vQAAotg6MrJnhlQZ | Work | 5pKCCKE2ajJHZ9KAiaK11H | 3TVXtAsR1Inumwj472S9r4 |
| 4aRD0bzvsBD0MAB4LcsRSM | Work | 5pKCCKE2ajJHZ9KAiaK11H | 3TVXtAsR1Inumwj472S9r4 |
| 4m6D70k5xMmCDCB19u7Bi0 | Work | 5pKCCKE2ajJHZ9KAiaK11H | 3TVXtAsR1Inumwj472S9r4 |
+------------------------+------+------------------------+------------------------+
然后只需按t.name,first_artist,second_artist添加一个组。
这真的是最好的方法吗?特别是考虑到一些歌曲中有超过10位艺术家合作?我的数据库构建得不好吗?