Powinieneś naprawdę spojrzeć na Normalizacja bazy danych
i najpierw znormalizuj swoją strukturę, dodając tabelę skrzyżowań i przechowując relację z tablec każda relacja przechowywana w tablec będzie przechowywana w nowej tabeli skrzyżowań, ale nie jako lista oddzielona przecinkami, każdy wiersz będzie zawierał identyfikator c i jeden identyfikator użytkownika na wiersz, jeśli nie możesz zmienić schematu, możesz użyć find_in_set
znaleźć wartości w zestawie
select *
from tblC c
JOIN tblB b
ON (find_in_set(b.userid,c.userids) > 0)
where c.nname="new1"
Edytuj, aby znormalizować schemat
Usunąłem userids
kolumna z Twojego tblC
zamiast tego utworzyłem nową tabelę połączeń jako tblC_user
z 2 kolumnami c_id
będzie to powiązane z kolumną identyfikatora tblC
a drugi userid
do przechowywania użytkowników relacji z użytkownikami dla tblC
zobacz przykładowy schemat dla 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 oto twoja tabela połączeń 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');
Powyżej, jeśli zauważysz, że nie zachowałem żadnych relacji oddzielonych przecinkami, każda relacja użytkownika dla tblC
jest przechowywany w nowym wierszu, dla ciebie, którego dotyczy zestaw wyników, użyłem tabeli połączeń w łączeniu, a nowe zapytanie będzie takie jak poniżej
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"
Teraz powyższe zapytanie można zoptymalizować za pomocą indeksów, dzięki czemu można łatwo utrzymywać kaskadowe relacje