Det är bättre att normalisera ditt schema, lagra inte relationer i form av kommaseparerad lista istället skapa en kopplingstabell för detta som att behålla en m:m många till många relationer mellan användare och filter, skapa en ny tabell som user_filters
med kolumner filter-id och användar-id och i varje rad spara en association per användare och filter som i din nuvarande schemarelation för filter 1 med många användare (1, '1, 2, 3')
kommer att bli som
filter id user id
(1, '1'),
(1, '2'),
(1, '3'),
Exempelschema kommer att vara så här
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')
;
För ovanstående schema kan du enkelt fråga med join as, nedanstående fråga kan optimeras med hjälp av index
select u.*
from users u
join user_filters uf on(uf.u_id = u.id)
where uf.fid =1
Exempeldemo
Om du inte kan ändra ditt schema och vill hålla fast vid det nuvarande kan du fråga enligt nedan men detta kan inte optimeras tillräckligt jämfört med ovanstående fråga
select u.*
from users u
join filters f on(find_in_set(u.id,replace(`u_ids`,' ','')) > 0)
where f.id =1