Sie sollten sich unbedingt Datenbanknormalisierung ansehen
und normalisieren Sie zuerst Ihre Struktur, indem Sie eine Verbindungstabelle hinzufügen und eine Beziehung aus tablec enthält. Jede in tablec gespeicherte Beziehung wird in einer neuen Verbindungstabelle gespeichert, jedoch nicht als kommagetrennte Liste. Jede Zeile enthält die ID von c und eine Benutzer-ID pro Zeile, wenn Sie Ihr Schema nicht ändern können, können Sie find_in_set
verwenden um Werte im Satz zu finden
select *
from tblC c
JOIN tblB b
ON (find_in_set(b.userid,c.userids) > 0)
where c.nname="new1"
Bearbeiten für Schema normalisieren
Ich habe userids
entfernt Spalte aus Ihrem tblC
und stattdessen habe ich eine neue Verbindungstabelle als tblC_user
erstellt mit 2 Spalten c_id
Dies bezieht sich auf die ID-Spalte von tblC
und zweitens eine userid
Benutzerbeziehungen Benutzer für tblC
zu speichern siehe Beispielschema für 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');
Und hier ist Ihre Verbindungstabelle als 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');
Wenn Sie oben bemerken, dass ich keine durch Kommas getrennten Beziehungen gespeichert habe, jede Beziehung des Benutzers für tblC
wird in einer neuen Zeile gespeichert, für Sie betreffende Ergebnismenge habe ich eine Verbindungstabelle in Join verwendet, auch eine neue Abfrage wird wie unten aussehen
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"
Jetzt kann die obige Abfrage optimiert werden, indem Sie Indizes verwenden, mit denen Sie einfach kaskadierende Beziehungen pflegen können