Opravdu byste se měli podívat na normalizaci databáze
a nejprve normalizujte svou strukturu přidáním spojovací tabulky a uchovávání vztahu z tabulky, každý vztah uložený v tabulce bude uložen v nové spojovací tabulce, ale ne jako seznam oddělený čárkami, každý řádek bude obsahovat id c a jedno uživatelské ID na řádek, pokud nemůžete změnit své schéma, můžete použít find_in_set
najít hodnoty v set
select *
from tblC c
JOIN tblB b
ON (find_in_set(b.userid,c.userids) > 0)
where c.nname="new1"
Upravit pro normalizaci schématu
Odebral jsem userids
sloupec z vašeho tblC
a místo toho jsem vytvořil novou spojovací tabulku jako tblC_user
se 2 sloupci c_id
to bude souviset se sloupcem id tblC
a druhý userid
k ukládání uživatelů vztahů s uživateli pro tblC
viz vzorové schéma pro 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');
A zde je vaše spojovací tabulka jako 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');
Pokud si všimnete výše, neuložil jsem žádné vztahy oddělené čárkami pro každý vztah uživatele pro tblC
je uložen v novém řádku, pro vás dotčenou sadu výsledků jsem ve spojení použil spojovací tabulku také nový dotaz bude jako níže
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"
Nyní lze výše uvedený dotaz optimalizovat pomocí indexů a snadno udržovat kaskádové vztahy