2015-06-18 51 views
1

在我的SQLite數據庫中,我有一個名爲Tracks的表,它由以下列組成:藝術家,曲目,流派1,流派2,流派3。 該表格包含許多具有不同genre1,genre2,genre3值的藝術家和曲目值相同的值。如下面的例子:SQLite將類似記錄的值合併爲一個

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 

任何幫助與此將非常感激。

+2

** **可怕的DB設計做什麼。真的,你應該瞭解**正常化**。 –

回答

1

不幸的是,它看起來像你正在遭受糟糕的數據庫設計。在上面的設計中,每首歌只限於3種風格,並且只有一種風格適用於歌曲時,您可以在所有風格字段中重複相同的值。在一個好的設計中,您應該能夠爲每首歌曲提供儘可能多或較少的流派條目,並且還可以減少存儲流派值所需的數據量。

因此,讓我們談談多對多關係和映射表。在這種情況下,多對多的關係將是屬於許多獨特歌曲條目的許多獨特的流派值。相反,這也應該是真實的,因爲我們也會有許多屬於許多(或可能沒有)流派的獨特歌曲。

那麼我們如何做到這一點?首先讓我們創建一個名爲流派的表格。我應該有兩個字段:整數主鍵和類型值的字符串,後者具有唯一約束。接下來我們需要一個映射表(用於futer參考可以稱之爲SongGenre),一個只有兩個外鍵字段的表,一個用於引用歌曲表,另一個用於引用流派表。每條唱片都會說這個流派屬於這首歌曲,我們每首歌曲可以有多個條目。

一旦你得到你的映射表的設置就可以達到你想要的是這樣

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