अपने स्कीमा को सामान्य करने के लिए बेहतर है कि संबंधों को अल्पविराम से अलग सूची के रूप में संग्रहीत न करें इसके बजाय इसके लिए एक जंक्शन तालिका बनाएं जैसे 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