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

SQL क्वेरी एकाधिक तालिकाओं, एकाधिक जुड़ने और अल्पविराम से अलग सूची के साथ कॉलम फ़ील्ड के साथ

यदि आप वास्तव में तालिका संरचना को संशोधित नहीं कर सकते हैं, तो शायद आप जो सबसे अच्छा कर सकते हैं वह पुरानी सूची हैक में से एक है:

  • एक JOIN का प्रयोग करें FIND_IN_SET(value, commaSeparatedString) के साथ

    SELECT n.Host, c.Name AS ControlName, s.Name AS ServiceName FROM node n LEFT JOIN control c ON c.controlID = n.controlID LEFT JOIN service s ON FIND_IN_SET(s.serviceID, n.serviceId) ORDER BY n.host, s.Name ;

  • LIKE Use का प्रयोग करें नोड सूची में एक विशिष्ट serviceID मान की उपस्थिति का पता लगाने के लिए

    SELECT n.Host, c.Name AS ControlName, s.Name AS ServiceName FROM node n LEFT JOIN control c ON c.controlID = n.controlID LEFT JOIN service s ON CONCAT(',', n.serviceID,',') LIKE CONCAT('%,', s.serviceID,',%') ORDER BY n.host, s.Name ;

SQLFiddle

हालांकि, जैसा कि आपने पहले ही नोट किया है कि कॉलम वास्तव में सामान्यीकृत किया जाना चाहिए। जबकि उपरोक्त विधियों को छोटे डेटा सेट के लिए काम करना चाहिए, वे "सूचियों" के साथ काम करने की सामान्य समस्याओं से ग्रस्त हैं। कोई भी तरीका बहुत इंडेक्स फ्रेंडली नहीं है, और इसके परिणामस्वरूप, अच्छी तरह से स्केल नहीं होगा। साथ ही, दोनों स्ट्रिंग तुलना करते हैं। तो थोड़ा सा अंतर मिलान को विफल कर सकता है। उदाहरण के लिए, 1,4 दो सर्विस आईडी से मेल खाएगा, जबकि 1,(space)4 या 1,4.0 केवल एक से मेल खाएगा।

टिप्पणियों के आधार पर अपडेट करें:

दूसरे पढ़ने पर, मुझे यकीन नहीं है कि उपरोक्त सटीक प्रश्न का उत्तर आप पूछ रहे हैं, लेकिन इसे काम करने के लिए एक अच्छा आधार प्रदान करना चाहिए ...

यदि आप अब CSV सूची नहीं चाहते हैं, तो बस ऊपर दिए गए प्रश्नों में से एक का उपयोग करें और सामान्य रूप से अलग-अलग क्वेरी कॉलम आउटपुट करें। परिणाम प्रति पंक्ति एक सेवा नाम होगा, अर्थात:

   server1 | Control Name One | Service Name 200
   server1 | Control Name One | Service Name 50
   ..

अन्यथा, यदि आपको अल्पविराम से अलग किए गए मानों को संरक्षित करने की आवश्यकता है, तो एक संभावना <cfoutput group=".."> का उपयोग करना है क्वेरी परिणामों पर। चूंकि परिणाम पहले "होस्ट" द्वारा आदेशित किए जाते हैं, नीचे दिए गए कोड की तरह कुछ। एनबी: "समूह" के ठीक से काम करने के लिए, परिणामों को Host . द्वारा क्रमबद्ध किया जाना चाहिए और आपको कई cfoutput . का उपयोग करना चाहिए नीचे दिखाए गए टैग।

 <cfoutput query="..." group="Host"> 
    #Host# |
    #ControlName# |
    <cfoutput>
      #ServiceName#,
    </cfoutput>
    <br>
 </cfoutput>

परिणाम इस तरह दिखना चाहिए:

server1 | Control Name One | Service Name 200, Service Name 50, Service Name Four, Service Name One, Service Name Three, Service Name Two, 
server2 | Control Name Two | Service Name 200, Service Name Four, Service Name Three, Service Name Two, 
server3 | Control Name Two | Service Name 200, Service Name 50, Service Name Four, Service Name One, Service Name Three, Service Name Two, 
server4 | Control Name Three | Service Name 200, Service Name 50, Service Name One, Service Name Two, 
server5 | Control Name Three | Service Name Four, Service Name One, 


अपडेट 2:

मैं भूल गया कि cfoutput group . का एक आसान विकल्प है MySQL में:GROUP_CONCAT

<cfquery name="qry" datasource="MySQL5">
   SELECT n.Host, c.Name AS ControlName, GROUP_CONCAT(s.Name) AS ServiceNameList 
   FROM node n 
        LEFT JOIN control c ON c.controlID = n.controlID 
        LEFT JOIN service s ON FIND_IN_SET(s.serviceID, n.serviceId) 
   GROUP BY n.Host, c.Name
   ORDER BY n.host
</cfquery>



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. चेतावनी:इस पृष्ठ पर एक प्रपत्र में 1000 से अधिक फ़ील्ड हैं PHP MySql

  2. MYSQL में सभी तालिकाओं से डेटा हटाएं

  3. MySQL और PHP दशमलव सटीक गलत

  4. बड़े पैमाने पर रिकॉर्ड के लिए बल्क_क्रिएट का सर्वोत्तम अभ्यास

  5. MySQL में एक-से-अनेक संबंध - कैसे मॉडल बनाने के लिए?