songs
테이블에 genres
이 포함되어 있습니다.
는 지금
SELECT genres FROM songs WHERE id = 123;
은 무엇 당신이해야 할 것은 두 개의 추가 테이블을 만드는 것입니다 실행할 수, 노래 # 123의 장르를 알고 :
CREATE TABLE genres (
genre_id integer not null primary key auto_increment,
genre_name varchar(75)
);
CREATE TABLE song_has_genre (
song_id integer not null,
genre_id integer not null
);
이 사실을 저장하려면를 그 노래 (123) 장르 '민속', '팝', '재즈'와 '무엇이든'에, 당신은 실행할 수 있습니다
INSERT INTO song_has_genre
SELECT 123, genre_id FROM genres
WHERE genre_name IN ('Folk', 'Pop', 'Jazz', ...);
난을 어떤 노래를 조회하려면 n 개의 장르 포크,
SELECT songs.*, genres.genre_name FROM songs
JOIN song_has_genre AS shg ON (songs.id = shg.song_id)
JOIN genres ON (shg.genre_id = genres.genre_id)
WHERE genres.genre_name = 'Folk';
약간 더 많은 작업이 두 장르를 선택하고 하나의 노래가 모두있는 경우 중복을 피하기 위해, 또는 장르에 따라 선택 일부 곡의 모든 장르를 검색하는 데 필요한 (즉, 당신은 '검색 Pop ','Pop, Whatever '은 찾았지만'Techno, Jazz, Folk, Pop을 제외한 다른 것 '은 아니지만)'Pop, Jazz, Folk ','Pop, Techno ','Pop ' 예 GROUP_CONCAT
및/또는 GROUP BY
을 사용하거나 MySQL 외부의 코드에서).
스키마를 다시 디자인하기에는 너무 늦습니까? 배열을 열에 배치하는 것은 매우 안 좋은데 관계 테이블을 사용해야합니다. – Barmar
'implode()'를 사용하여 쉼표로 구분 된 목록을 열에 저장할 수 있습니다. 컬럼을 조회하고자 할 때,'FIND_IN_SET()'을 사용하여 값이리스트에 있는지 확인할 수 있습니다. 그러나이 작업은 매우 어려워 복잡한 쿼리를 거의 불가능하게 만듭니다. – Barmar
나는 추가 테이블을 사용할 수는 있지만, 생각해 보면 실제로 작동하지 않을 것입니다. 문제는 첫 번째 테이블에는 행마다 다중 장르가있을 수 있다는 것입니다. 장르 테이블을 만들면 장르마다 여러 곡이 다시 시작됩니다. – Karlovsky120