SQLite将类似记录的值合并为一个

时间:2015-06-18 20:53:18

标签: sqlite similarity records amalgamation

在我的SQLite数据库中,我有一个名为Tracks的表,它由以下列组成:artist,track,genre1,genre2,genre3。 该表包含许多具有相同艺术家和曲目值的值,这些值具有不同的genre1,genre2,genre3值。如下例所示:

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

对此的任何帮助都将非常感激。

1 个答案:

答案 0 :(得分:1)

不幸的是,您似乎遇到了数据库设计不佳的问题。在上面的设计中,每首歌曲仅限于3种类型,当只有一种类型适用于某首歌曲时,您只需在所有类型字段中重复相同的值。在一个好的设计中,你应该能够为每首歌曲提供尽可能多的或少的流派条目,同时你还可以减少存储流派值所需的数据量。

让我们谈谈多对多关系和映射表。在这种情况下,多对多关系将是属于许多独特歌曲条目的许多独特类型值。反之也是如此,因为我们还会有许多属于许多(或可能没有)类型的独特歌曲。

那么我们如何实现这一点......首先让我们创建一个名为Genres的表。我应该有两个字段:一个整数主键和一个类型值的字符串,后者具有唯一约束。接下来我们需要一个映射表(对于futer引用,我们称之为SongGenre),这个表只有两个外键字段,一个用于引用歌曲表,另一个用于引用类型表。每个唱片都会说这个类型属于这首歌,我们每首歌可以有多个条目。

一旦你获得了映射表设置,就可以实现你想要做的事情

SELECT Artist, Track, Group_Concat(Genre.GenreName) 
FROM Song 
JOIN SongGenre USING (SongID) 
JOIN Genre USING (GenreID) 
GROUP BY Artist, Track;