Mysql
 sql >> Database >  >> RDS >> Mysql

sql join tabelle in cui 1 colonna ha una virgola

Dovresti davvero guardare a Normalizzazione del database e prima normalizza la tua struttura aggiungendo una tabella di giunzione e contiene una relazione da tablec ogni relazione memorizzata in tablec verrà archiviata nella nuova tabella di giunzione ma non come un elenco separato da virgole ogni riga conterrà l'id di c e un ID utente per riga, se tu non puoi modificare il tuo schema puoi usare find_in_set per trovare i valori nel set

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

Guarda la demo

Modifica per normalizzare lo schema

Ho rimosso userids colonna dal tuo tblC e invece ho creato una nuova tabella di giunzione come tblC_user con 2 colonne c_id questo sarà correlato alla colonna id di tblC e il secondo userid per memorizzare gli utenti delle relazioni utente per tblC vedere lo schema di esempio per 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');

Ed ecco la tua tabella di giunzione come 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 alto se noti che non ho memorizzato alcuna relazione separata da virgole ogni relazione di utente per tblC è memorizzato in una nuova riga, per te il set di risultati che ti interessa ho usato la tabella di giunzione in join anche la nuova query sarà come di seguito

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

Ora la query sopra può essere ottimizzata utilizzando indici che puoi mantenere facilmente relazioni a cascata