मुझे कहना है - मैं स्टम्प्ड हूँ। मैं किसी ऐसे समाधान के बारे में नहीं सोच सकता जो इसके करीब भी आए। मैं इन दिशाओं में समाधान खोजने की कोशिश करूंगा:
- उपयोगकर्ता द्वारा परिभाषित समग्र कार्य। हो सकता है कि आप एक ऐसा फ़ंक्शन बना सकें जो तर्क के रूप में वांछित अभिव्यक्ति (सरलीकृत वाक्यविन्यास में) और एक व्यक्ति के लिए पंक्तियों को लेता है। फ़ंक्शन तब अभिव्यक्ति को पार्स करता है और पंक्तियों के विरुद्ध इसका मिलान करता है। हम्म ... शायद MySQL में कुछ समेकित कुल फ़ंक्शन और रेगेक्स मिलान फ़ंक्शन शामिल है? यह तब एक समाधान हो सकता है (हालांकि शायद बहुत तेज़ नहीं)।
- विश्लेषणात्मक कार्य। मैं यह दिखावा नहीं करता कि मैं उन्हें समझता हूं, लेकिन जितना मैं उनके बारे में जानता हूं, मुझे लगता है कि वे आम तौर पर इस दिशा में हैं। हालांकि मुझे नहीं पता कि इस आवश्यकता के अनुरूप कोई समारोह होगा या नहीं।
जोड़ा गया: आह, मुझे लगता है कि मुझे मिल गया! हालांकि मुझे लगता है कि प्रदर्शन दयनीय होगा। लेकिन यह काम करेगा! उदाहरण के लिए, यदि आपको 1 AND 2 AND (3 OR 4)
. की खोज करने की आवश्यकता है तब आप लिखेंगे:
SELECT
*
FROM
Persons A
WHERE
EXISTS (Select * from PersonCriteria B WHERE A.PersonID=B.PersonID AND CriteriaID=1)
AND
EXISTS (Select * from PersonCriteria B WHERE A.PersonID=B.PersonID AND CriteriaID=2)
AND
(
EXISTS (Select * from PersonCriteria B WHERE A.PersonID=B.PersonID AND CriteriaID=3)
OR
EXISTS (Select * from PersonCriteria B WHERE A.PersonID=B.PersonID AND CriteriaID=4)
)
जोड़ा गया 2: यहां एक और है, हालांकि प्रदर्शन और भी खराब होने की संभावना है:
SELECT p.* FROM Person p
JOIN (select PersonID from PersonCriteria WHERE CriteriaID=1) c1 ON p.PersonID=c1.PersonID
JOIN (select PersonID from PersonCriteria WHERE CriteriaID=2) c2 ON p.PersonID=c2.PersonID
JOIN (select PersonID from PersonCriteria WHERE CriteriaID IN (3,4)) c3 ON p.PersonID=c3.PersonID
3 जोड़ा गया: यह नंबर 2 का एक रूपांतर है, लेकिन यह वास्तव में एक अच्छे प्रदर्शन का मौका हो सकता है!
SELECT p.* FROM
Person p
JOIN PersonCriteria c1 on (p.PersonID=c1.PersonID AND c1.CriteriaID=1)
JOIN PersonCriteria c2 on (p.PersonID=c2.PersonID AND c2.CriteriaID=2)
JOIN PersonCriteria c3 on (p.PersonID=c3.PersonID AND c3.CriteriaID IN (3,4))
यदि आप कॉलम (पर्सनआईडी, क्राइटेरियाआईडी) (बिल्कुल इसी क्रम में!) पर PersonCriteria में एक इंडेक्स जोड़ते हैं, तो मुझे लगता है कि यह उतना ही तेज़ है जितना आप किसी भी मामले में प्राप्त करने जा रहे हैं।