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

SQLite combine values of similar records into one

在我的 SQLite 数据库中,我有一个名为 Tracks 的 table,它由以下列组成:艺术家、曲目、流派 1、流派 2、流派 3。 table 包含许多值,这些值具有相同的艺术家和曲目值,但具有不同的 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

如有任何帮助,我们将不胜感激。

很遗憾,您的数据库设计不佳。在上面的设计中,每首歌曲只能使用 3 种流派,当只有一种流派适用于一首歌曲时,您只需在所有流派字段中重复相同的值。在一个好的设计中,您应该能够为每首歌曲添加尽可能多或尽可能少的流派条目,并且您还可以减少存储流派值所需的数据量。

那么让我们谈谈多对多关系和映射 table。在这种情况下,多对多关系是属于许多独特歌曲条目的许多独特流派值。反之亦然,因为我们也会有许多属于许多(或可能 none)流派的独特歌曲。

那么我们如何实现这一点...那么首先让我们制作一个 table 称为 Genres。我应该有两个字段:一个整数主键和一个流派值字符串,后者具有唯一约束。接下来我们需要一个映射 table(为了以后的参考我们称之为 SongGenre),一个 table 只有两个外键字段,一个用于引用歌曲 table 和一个用于引用流派 table。每条记录都会说这个流派属于这首歌,每首歌我们可以有多个条目。

一旦你得到你的映射 table 设置,你就可以用这样的东西实现你想做的事情

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