Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

sql join tabelas onde 1 coluna tem vírgula


Você deve realmente olhar para Normalização de banco de dados e primeiro normalize sua estrutura adicionando uma tabela de junção e mantenha uma relação de tablec cada relação armazenada em tablec será armazenada em uma nova tabela de junção, mas não como uma lista separada por vírgulas, cada linha conterá id de c e um id de usuário por linha, se você não pode alterar seu esquema você pode usar find_in_set para encontrar valores no conjunto
select *  
from  tblC c
JOIN tblB b
ON (find_in_set(b.userid,c.userids) > 0)
where c.nname="new1"

Ver demonstração

Editar para normalizar esquema

Eu removi userids coluna do seu tblC e, em vez disso, criei uma nova tabela de junção como tblC_user com 2 colunas c_id isso será relacionado à coluna id de tblC e o segundo userid para armazenar usuários de relações de usuário para tblC veja o esquema de amostra para 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');

E aqui está sua tabela de junção como 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');

Acima, se você notar que não armazenei nenhuma relação separada por vírgula, cada relação de usuário para tblC é armazenado em uma nova linha, para você, o conjunto de resultados em questão eu usei a tabela de junção na junção e a nova consulta será como abaixo
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"

Demonstração 2

Agora, a consulta acima pode ser otimizada usando índices, você pode manter relações em cascata facilmente