यदि आप वास्तव में तालिका संरचना को संशोधित नहीं कर सकते हैं, तो शायद आप जो सबसे अच्छा कर सकते हैं वह पुरानी सूची हैक में से एक है:
-
एक
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 ;
हालांकि, जैसा कि आपने पहले ही नोट किया है कि कॉलम वास्तव में सामान्यीकृत किया जाना चाहिए। जबकि उपरोक्त विधियों को छोटे डेटा सेट के लिए काम करना चाहिए, वे "सूचियों" के साथ काम करने की सामान्य समस्याओं से ग्रस्त हैं। कोई भी तरीका बहुत इंडेक्स फ्रेंडली नहीं है, और इसके परिणामस्वरूप, अच्छी तरह से स्केल नहीं होगा। साथ ही, दोनों स्ट्रिंग तुलना करते हैं। तो थोड़ा सा अंतर मिलान को विफल कर सकता है। उदाहरण के लिए, 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>