Je moet echt kijken naar Databasenormalisatie
en normaliseer eerst uw structuur door een verbindingstabel toe te voegen en bevat een relatie van tablec elke relatie die in tablec is opgeslagen, wordt opgeslagen in een nieuwe verbindingstabel, maar niet als een door komma's gescheiden lijst, elke rij bevat de id van c en één gebruikers-id per rij, als u kan je schema niet wijzigen, je kunt find_in_set
gebruiken om waarden in set te vinden
select *
from tblC c
JOIN tblB b
ON (find_in_set(b.userid,c.userids) > 0)
where c.nname="new1"
Bewerken om schema te normaliseren
Ik heb userids
verwijderd kolom uit uw tblC
en in plaats daarvan heb ik een nieuwe verbindingstabel gemaakt als tblC_user
met 2 kolommen c_id
dit heeft betrekking op de id-kolom van tblC
en de tweede userid
om gebruikersrelaties op te slaan voor tblC
zie voorbeeldschema voor 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');
En hier is uw verbindingstabel 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');
In het bovenstaande, als je merkt dat ik geen door komma's gescheiden relaties heb opgeslagen, elke relatie van gebruiker voor tblC
wordt opgeslagen in een nieuwe rij, voor de betreffende resultatenset heb ik de verbindingstabel gebruikt in de join, ook zal de nieuwe query zijn zoals hieronder
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"
Bovenstaande query kan nu worden geoptimaliseerd door gebruik te maken van indexen waarmee u gemakkelijk trapsgewijze relaties kunt onderhouden