簡體   English   中英

SQLite將類似記錄的值合並為一個

[英]SQLite combine values of similar records into one

在我的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

任何幫助,將不勝感激。

不幸的是,您似乎正遭受數據庫設計不佳的困擾。 在上面的設計中,每首歌曲只能限制3種流派,並且當一首歌曲僅適用於一種流派時,您只需在所有流派字段中重復相同的值即可。 在一個好的設計中,每首歌曲應具有或多或少的流派條目,也可以減少存儲流派值所需的數據量。

因此,讓我們談談多對多關系和映射表。 在這種情況下,多對多關系是屬於許多獨特歌曲條目的許多獨特流派值。 反之亦然,因為我們還將擁有許多屬於(或可能沒有)流派的獨特歌曲。

那么我們如何實現這一目標呢?首先讓我們創建一個名為Genres的表。 我應該有兩個字段:一個整數主鍵和一個用於類型值的字符串,后者具有唯一性約束。 接下來,我們將需要一個映射表(供大家參考,稱為SongGenre),該表只有兩個外鍵字段,一個用於引用歌曲表,另一個用於引用類型表。 每條記錄都會說該流派屬於這首歌,而每首歌我們可以有多個條目。

一旦您完成了映射表的設置,就可以使用以下方法實現您想要的功能

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM