sql join tables where 1 column has comma

后端 未结 1 1090
眼角桃花
眼角桃花 2020-11-29 14:17

how can I get all usernames when I search \"new1\" .For eg: I should get A and B as userids 1,2 in tblC is 1,2 for row1 which has new1.What query should I use to get the abo

相关标签:
1条回答
  • 2020-11-29 14:33

    You should really look at Database normalization and first normalize your structure by adding a junction table and holds a relation from tablec each relation stored in tablec will be stored in new junction table but not as comma separated list each row will hold id of c and one user id per row ,if you can't alter your schema you can use find_in_set to find values in set

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

    See demo


    Edit for normalize schema

    I have removed userids column from your tblC and instead i have created a new junction table as tblC_user with 2 columns c_id this will related to the id column of tblC and second one userid to store user relations users for tblC see sample schema for 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');
    

    And here is your junction table as 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');
    

    In above if you notice i haven't stored any comma separated relations each relation of user for tblC is stored in new row ,for you concerned result set i have used junction table in join also new query will be like below

    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"
    

    Demo 2

    Now above query can can be optimized by using indexes you can maintain cascading relations easily

    0 讨论(0)
提交回复
热议问题