Il est préférable de normaliser votre schéma ne stockez pas les relations sous forme de liste séparée par des virgules créez plutôt une table de jonction pour cela comme pour maintenir un m:m relation plusieurs à plusieurs entre les utilisateurs et les filtres, créez une nouvelle table en tant que user_filters
avec les colonnes filter id et user id et dans chaque ligne enregistrez une association par utilisateur et filtrez comme dans votre relation de schéma actuelle pour le filtre 1 avec de nombreux utilisateurs (1, '1, 2, 3')
deviendra comme
filter id user id
(1, '1'),
(1, '2'),
(1, '3'),
L'exemple de schéma ressemblera à ceci
CREATE TABLE user_filters
(`fid` int, `u_id` varchar(50))
;
INSERT INTO user_filters
(`fid`, `u_id`)
VALUES
(1, '1'),
(1, '2'),
(1, '3'),
(2, '5'),
(2, '5')
;
CREATE TABLE filters
(`id` int, `title` varchar(50))
;
INSERT INTO filters
(`id`, `title`)
VALUES
(1, 'test'),
(2, 'test 1')
;
CREATE TABLE users
(`id` int, `name` varchar(6))
;
INSERT INTO users
(`id`, `name`)
VALUES
(1, 'Tom'),
(2, 'Tim'),
(3, 'Sue'),
(4, 'Bruce'),
(5, 'Ann'),
(6, 'George')
;
Pour le schéma ci-dessus, vous pouvez facilement interroger avec join as, la requête ci-dessous peut être optimisée à l'aide d'index
select u.*
from users u
join user_filters uf on(uf.u_id = u.id)
where uf.fid =1
Exemple de démonstration
Si vous n'êtes pas en mesure de modifier votre schéma et que vous souhaitez vous en tenir à celui actuel, vous pouvez interroger comme ci-dessous, mais celui-ci ne peut pas être suffisamment optimisé par rapport à la requête ci-dessus
select u.*
from users u
join filters f on(find_in_set(u.id,replace(`u_ids`,' ','')) > 0)
where f.id =1