1

私の 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

これに関する任意の助けをいただければ幸いです。

4

1 に答える 1

1

残念ながら、データベースの設計が不十分なようです。上記の設計では、曲ごとに 3 つのジャンルのみに制限されています。曲に適用できるジャンルが 1 つだけの場合は、すべてのジャンル フィールドで同じ値を繰り返すだけです。優れた設計では、1 曲あたりのジャンル エントリをできるだけ多くまたは少なくできるようにする必要があります。また、ジャンル値を格納するために必要なデータの量を減らすこともできます。

それでは、多対多の関係とマッピング テーブルについて話しましょう。この状況での多対多の関係は、多くの固有の曲エントリに属する​​多くの固有のジャンル値になります。これは逆の場合にも当てはまります。なぜなら、多くの (またはまったくない) ジャンルに属する多くのユニークな曲もあるからです。

では、どうすればこれを実現できるのでしょうか... まず、Genres というテーブルを作成しましょう。整数の主キーとジャンル値の文字列の 2 つのフィールドが必要です。後者には一意の制約があります。次に、2 つの外部キー フィールド (1 つはソング テーブルを参照するためのもの、もう 1 つはジャンル テーブルを参照するためのもの) だけを持つマッピング テーブル (後で参照するために、SongGenre と呼びます) が必要です。各レコードは、このジャンルがこの曲に属していることを示しており、曲ごとに複数のエントリを持つことができます。

マッピングテーブルのセットアップを取得したら、このようなものでやりたいことを達成できます

SELECT Artist, Track, Group_Concat(Genre.GenreName) 
FROM Song 
JOIN SongGenre USING (SongID) 
JOIN Genre USING (GenreID) 
GROUP BY Artist, Track;
于 2015-06-18T23:39:58.017 に答える