在我的SQLite数据库中,我有一个名为Tracks的表,它由以下列组成:艺术家,曲目,流派1,流派2,流派3。该表包含许多具有相同艺术家和曲目值的值,具有不同的流派 1、流派 2、流派 3 值。如下例所示:
artist | track | genre1 | genre2 | genre3
ABBA | Song 1 | Rock | Rock | Rock
U2 | Song 4 | Rock | Rock | Rock
ABBA | Song 1 | Pop | Pop | Pop
U2 | Song 4 | Pop | Pop | Pop
ABBA | Song 1 | 70s | 70s | 70s
U2 | Song 4 | 90s | 90s | 90s
我需要创建一个 SQLite 语句,该语句将合并艺术家和曲目相同的所有独特流派值,如下所示:
artist | track | genre1 | genre2 | genre3
ABBA | Song 1 | Rock | Pop | 70s
U2 | Song 4 | Pop | Rock | 90s
任何这方面的帮助将不胜感激。
看起来您正在遭受糟糕的数据库设计。在上面的设计中,每首歌只能使用3种流派,当只有一种流派适用于一首歌曲时,您只需在所有流派字段中重复相同的值。在一个好的设计中,你应该能够让每首歌有或多或少的流派条目,你也可以减少存储流派值所需的数据量。
因此,让我们谈谈多对多关系和映射表。在这种情况下,多对多关系将是属于许多唯一歌曲条目的许多独特流派值。反之亦然,因为我们还将拥有许多属于许多(或可能没有)流派的独特歌曲。
那么我们如何实现这一目标...首先,让我们制作一个名为流派的表格。我应该有两个字段:一个整数主键和一个用于流派值的字符串,对后者具有唯一的约束。接下来,我们需要一个映射表(为了进一步参考,我们称之为 SongGenre),一个只有两个外键字段的表,一个用于引用歌曲表,另一个用于引用流派表。每条唱片都会说这种类型属于这首歌,我们可以每首歌有多个条目。
一旦你设置了映射表,你就可以用这样的东西实现你想做的事情
SELECT Artist, Track, Group_Concat(Genre.GenreName)
FROM Song
JOIN SongGenre USING (SongID)
JOIN Genre USING (GenreID)
GROUP BY Artist, Track;