Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

SQL में फ़िल्टर सिस्टम को कैसे कार्यान्वित करें?

entity-attribute-value आपके द्वारा सुझाया गया मॉडल इस परिदृश्य में फिट हो सकता है।

फ़िल्टरिंग क्वेरी के संबंध में, आपको यह समझना होगा कि ईएवी मॉडल के साथ आप बहुत अधिक क्वेरी पावर का त्याग करेंगे, इसलिए यह काफी मुश्किल हो सकता है। हालाँकि आपकी समस्या से निपटने का यह एक तरीका है:

SELECT    stuff.id 
FROM      stuff 
JOIN      (SELECT    COUNT(*) matches
           FROM      table
           WHERE     (`key` = X1 AND `value` = V1) OR 
                     (`key` = X2 AND `value` = V2) 
           GROUP BY  id
          ) sub_t ON (sub_t.matches = 2 AND sub_t.id = stuff.id)
GROUP BY  stuff.id;

इस दृष्टिकोण की एक सुरुचिपूर्ण विशेषता यह है कि आपको sub_t.matches = 2 में मिलान करने के लिए अपेक्षित विशेषता/मान युग्मों की संख्या निर्दिष्ट करने की आवश्यकता है। . यदि हमारे पास तीन शर्तें होती तो हमें sub_t.matches = 3 . निर्दिष्ट करना पड़ता , और इसी तरह।

आइए एक टेस्ट केस बनाएं:

CREATE TABLE stuff (`id` varchar(20), `key` varchar(20), `value` varchar(20));

INSERT INTO stuff VALUES ('apple',  'color',  'red');
INSERT INTO stuff VALUES ('mango',  'color',  'yellow');
INSERT INTO stuff VALUES ('banana', 'color',  'yellow');

INSERT INTO stuff VALUES ('apple',  'taste',  'sweet');
INSERT INTO stuff VALUES ('mango',  'taste',  'sweet');
INSERT INTO stuff VALUES ('banana', 'taste',  'bitter-sweet');

INSERT INTO stuff VALUES ('apple',  'origin',  'US');
INSERT INTO stuff VALUES ('mango',  'origin',  'MEXICO');
INSERT INTO stuff VALUES ('banana', 'origin',  'US');

प्रश्न:

SELECT    stuff.id 
FROM      stuff 
JOIN      (SELECT    COUNT(*) matches, id
           FROM      stuff
           WHERE     (`key` = 'color' AND `value` = 'yellow') OR 
                     (`key` = 'taste' AND `value` = 'sweet')
           GROUP BY  id
          ) sub_t ON (sub_t.matches = 2 AND sub_t.id = stuff.id)
GROUP BY  stuff.id;

परिणाम:

+-------+
| id    |
+-------+
| mango |
+-------+
1 row in set (0.02 sec)

आइए अब color=yellow with के साथ एक और फल डालें और taste=sweet :

INSERT INTO stuff VALUES ('pear', 'color', 'yellow');
INSERT INTO stuff VALUES ('pear', 'taste', 'sweet');
INSERT INTO stuff VALUES ('pear', 'origin', 'somewhere');

वही क्वेरी वापस आएगी:

+-------+
| id    |
+-------+
| mango |
| pear  |
+-------+
2 rows in set (0.00 sec)

अगर हम इस परिणाम को origin=MEXICO . वाली संस्थाओं तक सीमित रखना चाहते हैं , हमें एक और OR जोड़ना होगा sub_t.matches = 3 . की स्थिति और जाँच करें 2 . के बजाय ।

SELECT    stuff.id 
FROM      stuff 
JOIN      (SELECT    COUNT(*) matches, id
           FROM      stuff
           WHERE     (`key` = 'color' AND `value` = 'yellow') OR 
                     (`key` = 'taste' AND `value` = 'sweet') OR 
                     (`key` = 'origin' AND `value` = 'MEXICO')
           GROUP BY  id
          ) sub_t ON (sub_t.matches = 3 AND sub_t.id = stuff.id)
GROUP BY  stuff.id;

परिणाम:

+-------+
| id    |
+-------+
| mango |
+-------+
1 row in set (0.00 sec)

जैसा कि हर दृष्टिकोण में होता है, ईएवी मॉडल का उपयोग करते समय कुछ फायदे और नुकसान होते हैं। सुनिश्चित करें कि आपने अपने आवेदन के संदर्भ में विषय पर व्यापक शोध किया है। आप वैकल्पिक संबंधपरक डेटाबेस पर भी विचार कर सकते हैं, जैसे Cassandra , CouchDB , MongoDB , Voldemort , HBase , SimpleDB या अन्य महत्वपूर्ण मूल्य स्टोर।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेटाबेस को ऑप्टिमाइज़ करने के लिए MySQL परफॉर्मेंस ट्यूनिंग टिप्स

  2. वीडियो शेयरिंग साइट बनाना, वीडियो प्लेयर की आवश्यकता है

  3. MySQL में एक स्ट्रिंग को "अनहेक्स" करने के 3 तरीके

  4. डेटाबेस में गूगल मैप्स ओवरले शेप को कैसे सेव करें?

  5. तिथि के साथ ऑपरेटर से अधिक का उपयोग कैसे करें?