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

SQL समस्या:एक से अनेक संबंध और EAV मॉडल

आपके प्रश्न का संक्षिप्त उत्तर है नहीं, आप जिस परिणाम सेट की तलाश कर रहे हैं उसे प्राप्त करने के लिए MySQL में कोई सरल निर्माण नहीं है।

लेकिन इस तरह के प्रश्न को सावधानीपूर्वक (कठिनाई से) तैयार करना संभव है। यहाँ एक उदाहरण है, मुझे विश्वास है कि आप इसे समझने में सक्षम होंगे। मूल रूप से, मैं चयन सूची में सहसंबद्ध उपश्रेणियों का उपयोग कर रहा हूं, प्रत्येक विशेषता के लिए जिसे मैं वापस करना चाहता हूं।

SELECT t.id
     , t.name
     , t.nickname

     , ( SELECT v1.attribute_value 
           FROM team_information v1 
           JOIN attributes a1
             ON a1.id = v1.attribute_id AND a1.attribute_name = 'city'
          WHERE v1.team_id = t.id ORDER BY 1 LIMIT 1
       ) AS city

     , ( SELECT v2.attribute_value
           FROM team_information v2 JOIN attributes a2
             ON a2.id = v2.attribute_id AND a2.attribute_name = 'captain'
          WHERE v2.team_id = t.id ORDER BY 1 LIMIT 1
       ) AS captain

     , ( SELECT v3.attribute_value
           FROM team_information v3 JOIN attributes a3
             ON a3.id = v3.attribute_id AND a3.attribute_name = 'f_number'
          WHERE v3.team_id = t.id ORDER BY 1 LIMIT 1
       ) AS f_number

  FROM teams t
 ORDER BY t.id

'बहु-मूल्यवान' विशेषताओं के लिए, आपको विशेषता के प्रत्येक उदाहरण को अलग से खींचना होगा। (यह निर्दिष्ट करने के लिए LIMIT का उपयोग करें कि क्या आप पहले वाले, दूसरे वाले, आदि को पुनः प्राप्त कर रहे हैं)

     , ( SELECT v4.attribute_value
           FROM team_information v4 JOIN attributes a4
             ON a4.id = v4.attribute_id AND a4.attribute_name = 'nickname'
          WHERE v4.team_id = t.id ORDER BY 1 LIMIT 0,1
       ) AS nickname_1st

     , ( SELECT v5.attribute_value
           FROM team_information v5 JOIN attributes a5
             ON a5.id = v5.attribute_id AND a5.attribute_name = 'nickname'
          WHERE v5.team_id = t.id ORDER BY 1 LIMIT 1,1
       ) AS nickname_2nd

     , ( SELECT v6.attribute_value
           FROM team_information v6 JOIN attributes a6
             ON a6.id = v6.attribute_id AND a6.attribute_name = 'nickname'
          WHERE v6.team_id = t.id ORDER BY 1 LIMIT 2,1
       ) AS nickname_3rd

मैं यहां एक उदाहरण के रूप में उपनाम का उपयोग करता हूं, क्योंकि अमेरिकी सॉकर क्लबों में अक्सर एक से अधिक उपनाम होते हैं, उदा। शिकागो फायर सॉकर क्लब के उपनाम हैं:'द फायर', 'ला माक्विना रोजा', 'मेन इन रेड', 'सीएफ97', और अन्य।)

आपके प्रश्न का उत्तर नहीं, लेकिन...

क्या मैंने पहले कई बार उल्लेख किया है कि मैं ईएवी डेटाबेस कार्यान्वयन के साथ काम करना कितना नापसंद करता हूं? आईएमओ क्या होना चाहिए एक बहुत ही सरल क्वेरी संभावित रूप से हल्की धुंधली क्वेरी के अत्यधिक जटिल जानवर में बदल जाती है।

क्या ऐसी तालिका बनाना ज्यादा आसान नहीं होगा जहां प्रत्येक "विशेषता" एक अलग कॉलम हो? फिर उचित परिणाम सेट वापस करने के लिए प्रश्न अधिक उचित लगेंगे...

SELECT id, name, nickname, city, captain, f_number, ... FROM team

लेकिन जो चीज वास्तव में मुझे झकझोरती है वह यह संभावना है कि कुछ डेवलपर यह तय करने जा रहे हैं कि "सरल" क्वेरी को सक्षम करने के लिए एलडीक्यू को डेटाबेस में "छिपा" होना चाहिए।

यदि आप इस मार्ग पर जाते हैं, तो कृपया किसी भी आग्रह का विरोध करें कि आपको इस क्वेरी को डेटाबेस में एक दृश्य के रूप में संग्रहीत करना पड़ सकता है।



  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 5.7 में चर का उपयोग करके प्रकार की कार्यक्षमता द्वारा विभाजन कैसे प्राप्त करें

  2. क्या प्राथमिक कुंजी पर बनाने और अनुक्रमित करने का कोई लाभ है?

  3. स्तंभ नाम के साथ कई स्तंभों का सबसे बड़ा मूल्य?

  4. किसी अन्य तालिका से MySQL में सम्मिलित करें

  5. MySQL:सेकंड में दो टाइमस्टैम्प के बीच अंतर कैसे प्राप्त करें