SQLite комбинира стойности на подобни записи в един

В моята база данни SQLite имам таблица, наречена Tracks, която се състои от следните колони: изпълнител, песен, 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

Всяка помощ с това ще бъде изключително оценена.


person Adam    schedule 18.06.2015    source източник
comment
Ужасен db дизайн. Наистина, трябва да научите за нормализиране.   -  person Phantômaxx    schedule 19.06.2015


Отговори (1)


За съжаление изглежда, че страдате от лош дизайн на базата данни. В дизайна по-горе вие ​​сте ограничени само до 3 жанра на песен и когато само един жанр е приложим за песен, вие просто повтаряте една и съща стойност във всички жанрови полета. В един добър дизайн трябва да можете да имате възможно най-много или по-малко жанрови записи на песен, както и можете също да намалите количеството данни, необходими за съхраняване на жанрови стойности.

Така че нека да поговорим за отношенията много към много и таблиците за картографиране. Връзката много към много в тази ситуация би била много уникални жанрови стойности, принадлежащи на много уникални песни. Това трябва да е вярно и за обратното, защото ще имаме и много уникални песни, принадлежащи към много (или евентуално нито един) жанрове.

И така, как да постигнем това... Първо нека направим таблица, наречена Жанрове. Трябва да имам две полета: първичен ключ с цяло число и низ за стойността на жанра, с уникално ограничение за последното. След това ще ни е необходима таблица за съпоставяне (за по-нататъшна справка нека я наречем SongGenre), таблица, която има само две полета за външен ключ, едно за препратка към таблицата с песни и едно за препращане към таблицата с жанрове. Всеки запис ще казва, че този жанр принадлежи на тази песен и можем да имаме няколко записа за песен.

след като получите настройката на вашата таблица за картографиране, можете да постигнете това, което искате да направите с нещо подобно

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