По-добре е да нормализирате вашата схема, не съхранявайте релациите под формата на списък, разделен със запетая, вместо да създайте таблица за свързване за това, като например да поддържате m:m много към много връзка между потребители и филтри, създайте нова таблица като user_filters
с колони филтър идентификатор и потребителски идентификатор и във всеки ред запишете по една асоциация на потребител и филтър, както във вашата текуща схема на релация за филтър 1 с много потребители (1, '1, 2, 3')
ще стане като
filter id user id
(1, '1'),
(1, '2'),
(1, '3'),
Примерната схема ще бъде следната
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')
;
За горната схема можете лесно да правите заявка с присъединяване, тъй като заявката по-долу може да бъде оптимизирана с помощта на индекси
select u.*
from users u
join user_filters uf on(uf.u_id = u.id)
where uf.fid =1
Примерна демонстрация
Ако не можете да промените схемата си и искате да се придържате към текущата, можете да направите заявка по-долу, но тази не може да бъде достатъчно оптимизирана в сравнение с горната заявка
select u.*
from users u
join filters f on(find_in_set(u.id,replace(`u_ids`,' ','')) > 0)
where f.id =1