복붙노트

[SQL] 1 열은 쉼표 갖는 경우 조인 테이블 SQL

SQL

1 열은 쉼표 갖는 경우 조인 테이블 SQL

내가 "기능 1"을 검색 할 때 어떻게 모든 사용자 이름을 얻을 수 있습니다 .FOR 예 : 나는 tblC에서 1,2 내가 위의 결과를 얻기 위해 사용한다 new1.What 쿼리를 가지고 ROW1 1,2입니다 아이디로 A와 B를 얻을해야합니까? 정말 사전에 어떤 help.Thanks을 주셔서 감사합니다. http://sqlfiddle.com/#!2/1ab8e/2

CREATE TABLE if not exists tblA
(
id int(11) NOT NULL auto_increment ,
user varchar(255),
 category int(255),
 PRIMARY KEY (id)
);

CREATE TABLE if not exists tblB
(
id int(11) NOT NULL auto_increment ,
username varchar(255),
 userid int(255),
 PRIMARY KEY (id)
);

CREATE TABLE if not exists tblC
(
id int(11) NOT NULL auto_increment ,
nname varchar(255),
 userids varchar(255),
 PRIMARY KEY (id)
);


INSERT INTO tblA (user, category ) VALUES
('1', '1'),
('1', '2'),
('1', '3'),
('1', '1'),
('2', '1'),
('2', '1'),
('2', '1'),
('2', '1'),
('3', '1'),
('2', '1'),
('4', '1'),
('4', '1'),
('2', '1');


INSERT INTO tblB (userid, username ) VALUES
('1', 'A'),
('2', 'B'),
('3', 'C'),
('4', 'D'),
('5', 'E');


INSERT INTO tblC (id, nname,userids ) VALUES
('1', 'new1','1,2'),
('2', 'new2','1,3'),
('3', 'new3','1,4'),
('4', 'new4','3,2'),
('5', 'new5','5,2');

쿼리 지금까지 :

select * where nname="new1" from  tblC
CROSS JOIN tblB
ON tblB.userid=(SELECT userids FROM substr(tblC.userids,','))

해결법

  1. ==============================

    1.당신은 정말 tablec에 저장된 각각의 관계가 새로운 접합 테이블에 저장되지만 쉼표로 구분 된 목록없는 각 행은 C와 하나의 ID를 개최한다 데이터베이스 정규화보고 처음 정상화 당신의 구조를 접합 테이블을 추가하고 tablec에서 관계를 유지해야한다 당신이 당신의 스키마를 변경할 수없는 경우 행마다 사용자 ID, 당신은 세트의 값을 찾기 위해 FIND_IN_SET 사용할 수 있습니다

    당신은 정말 tablec에 저장된 각각의 관계가 새로운 접합 테이블에 저장되지만 쉼표로 구분 된 목록없는 각 행은 C와 하나의 ID를 개최한다 데이터베이스 정규화보고 처음 정상화 당신의 구조를 접합 테이블을 추가하고 tablec에서 관계를 유지해야한다 당신이 당신의 스키마를 변경할 수없는 경우 행마다 사용자 ID, 당신은 세트의 값을 찾기 위해 FIND_IN_SET 사용할 수 있습니다

    select *  
    from  tblC c
    JOIN tblB b
    ON (find_in_set(b.userid,c.userids) > 0)
    where c.nname="new1"
    

    데모보기

    정상화 스키마 편집

    나는 당신의 tblC에서 사용자 ID 열을 제거하고 2 열이가 tblC에 대한 저장소 사용자 관계 사용자에게 tblC의 ID 열 및 두 번째 사용자 ID와 관련된 것입니다 C_ID로 대신 내가 tblC_user로 새로운 접합 테이블을 만든이 tblC 샘플 스키마를 참조

    CREATE TABLE if not exists tblC
    (
    id int(11) NOT NULL auto_increment ,
    nname varchar(255),
     PRIMARY KEY (id)
    );
    
    INSERT INTO tblC (id, nname) VALUES
    ('1', 'new1'),
    ('2', 'new2'),
    ('3', 'new3'),
    ('4', 'new4'),
    ('5', 'new5');
    

    그리고 여기 tblC_user 같은 접합 테이블

    CREATE TABLE if not exists tblC_user
    (
     c_id int,
     userid int
    );
    
    INSERT INTO tblC_user (c_id,userid) VALUES
    ('1','1'),
    ('1','2'),
    ('2','1'),
    ('2','3'),
    ('3','1'),
    ('3','4'),
    ('4','3'),
    ('4','2'),
    ('5','5'),
    ('5','2');
    

    만약 통보 만약 저장되지 않은 상기 임의 쉼표 tblC 사용자 각각의 관계는 사용자가 관련 검색 결과 제가 새로운 쿼리가 아래와 같이 것 또한 가입에서 사용한 접합 테이블을 설정, 새로운 행에 저장된 관계를 구분

    select *  
    from  tblC c
    join tblC_user cu on(c.id = cu.c_id)
    join tblB b on (b.userid = cu.userid)
    where c.nname="new1"
    

    데모 2

    이제 쿼리보다 쉽게 ​​계단식 관계를 유지할 수있는 인덱스를 사용하여 최적화 할 수 있습니다

  2. from https://stackoverflow.com/questions/25611999/sql-join-tables-where-1-column-has-comma by cc-by-sa and MIT license