Lebih baik untuk menormalkan skema Anda, jangan menyimpan hubungan dalam bentuk daftar yang dipisahkan koma alih-alih buat tabel persimpangan untuk ini seperti mempertahankan m:m hubungan banyak ke banyak antara pengguna dan filter, buat tabel baru sebagai user_filters
dengan kolom filter id dan user id dan di setiap baris simpan satu asosiasi per pengguna dan filter seperti dalam hubungan skema Anda saat ini untuk filter 1 dengan banyak pengguna (1, '1, 2, 3')
akan menjadi seperti
filter id user id
(1, '1'),
(1, '2'),
(1, '3'),
Contoh skemanya akan seperti ini
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')
;
Untuk skema di atas Anda dapat dengan mudah melakukan query dengan join as, query di bawah ini dapat dioptimalkan menggunakan indeks
select u.*
from users u
join user_filters uf on(uf.u_id = u.id)
where uf.fid =1
Contoh Demo
Jika Anda tidak dapat mengubah skema dan ingin tetap menggunakan skema saat ini, Anda dapat melakukan kueri seperti di bawah ini, tetapi skema ini tidak dapat dioptimalkan secara memadai dibandingkan dengan kueri di atas
select u.*
from users u
join filters f on(find_in_set(u.id,replace(`u_ids`,' ','')) > 0)
where f.id =1