दिलचस्प पोस्ट
ओरेकल: '= किसी भी ()' बनाम 'आईएन ()' डबल अंडर्सकोर (__const) सी में क्या मतलब है? सेवा को पुनरारंभ करने के लिए मजबूर कैसे करें? स्थाई / स्थगित होने पर महत्वपूर्ण परिवर्तन स्थान एपीआई के लिए व्यवहार? आउटलुक में फ्लोट करने के लिए समतुल्य Rewrite मॉड्यूल का उपयोग कर पृष्ठों से .aspx को हटाने? यह जावास्क्रिप्ट वाक्यविन्यास क्या है: {सीआई, सीसी}? ओपनग्ल: 3 डी पर 2 डी एचयूडी क्या एमएएमपी के साथ मायएसक्यूएल को एक कॉन्फिग फाइल शामिल नहीं किया गया है? .NET प्रक्रिया मॉनिटर मैं सीएसवी फ़ाइल को आईई पर डाउनलोड करने के लिए कैसे प्राप्त करूं? फ़ायरफ़ॉक्स पर काम करता है केवल एक समय में चलने वाले कार्य का एक सेट करें यूआरएलआईबी 2 या किसी भी अन्य http लाइब्रेरी का इस्तेमाल करते हुए टाइमआउट पढ़ें एक्शनबेरशेललॉक का उपयोग करके नई सहायतामैपफ्रैग्मेंट जावास्क्रिप्ट के साथ अपलोड करने से पहले छवि चौड़ाई और ऊंचाई की जांच करें

FIND_IN_SET () बनाम IN ()

मेरे डेटाबेस में मेरे पास 2 टेबल हैं एक आदेश के लिए है, और एक कंपनियों के लिए है

आदेश में यह संरचना है:

OrderID | attachedCompanyIDs ------------------------------------ 1 1,2,3 2 2,4 

और कंपनी की यह संरचना है:

 CompanyID | name -------------------------------------- 1 Company 1 2 Another Company 3 StackOverflow 4 Nothing 

ऑर्डर की कंपनियों के नाम पाने के लिए, मैं एक प्रश्न पूछ सकता हूं:

 SELECT name FROM orders,company WHERE orderID = 1 AND FIND_IN_SET(companyID, attachedCompanyIDs) 

यह क्वेरी ठीक काम करती है, लेकिन निम्न क्वेरी नहीं होती है।

 SELECT name FROM orders,company WHERE orderID = 1 AND companyID IN (attachedCompanyIDs) 

पहली क्वेरी क्यों काम करता है, लेकिन दूसरा नहीं?

पहली क्वेरी रिटर्न:

 name --------------- Company 1 Another Company StackOverflow 

दूसरी क्वेरी केवल रिटर्न:

 name --------------- Company 1 

ऐसा क्यों है, पहली क्वेरी सभी कंपनियों को क्यों लौटाती है, लेकिन दूसरी क्वेरी केवल पहले एक देता है?

Solutions Collecting From Web of "FIND_IN_SET () बनाम IN ()"

 SELECT name FROM orders,company WHERE orderID = 1 AND companyID IN (attachedCompanyIDs) 

attachedCompanyIDs एक स्केलर मान है जो INT ( companyID प्रकार) में डाली जाती है।

कलाकार केवल पहले अंकों की संख्या तक पहुंच देता है (आपके मामले में एक अल्पविराम)।

इस प्रकार,

 companyID IN ('1,2,3') ≡ companyID IN (CAST('1,2,3' AS INT)) ≡ companyID IN (1) 

PostgreSQL , आप स्ट्रिंग को सरणी में डाल सकते हैं (या उसे पहले स्थान पर एक सरणी के रूप में संग्रहीत कर सकते हैं):

 SELECT name FROM orders JOIN company ON companyID = ANY (('{' | attachedCompanyIDs | '}')::INT[]) WHERE orderID = 1 

और यह companyID पर सूचकांक का उपयोग भी करेगा

दुर्भाग्य से, यह MySQL में काम नहीं करता है क्योंकि बाद में एरे का समर्थन नहीं करता है।

आपको इस लेख को दिलचस्प मिल सकता है (देखें #2 ):

  • MySQL में 10 चीजें (जो अपेक्षित रूप से काम नहीं करेगा)

अद्यतन करें:

यदि अल्पविराम द्वारा विभाजित सूचियों में मानों की संख्या पर कोई उचित सीमा है (कहना है, 5 से अधिक नहीं), तो आप इस क्वेरी का उपयोग करने का प्रयास कर सकते हैं:

 SELECT name FROM orders CROSS JOIN ( SELECT 1 AS pos UNION ALL SELECT 2 AS pos UNION ALL SELECT 3 AS pos UNION ALL SELECT 4 AS pos UNION ALL SELECT 5 AS pos ) q JOIN company ON companyID = CAST(NULLIF(SUBSTRING_INDEX(attachedCompanyIDs, ',', -pos), SUBSTRING_INDEX(attachedCompanyIDs, ',', 1 - pos)) AS UNSIGNED) 

attachedCompanyIDs एक बड़ी स्ट्रिंग है, इसलिए mysql इसे अपने कलाकार के पूर्णांक में खोजने की कोशिश करता है

जब आप इसका उपयोग करते हैं

इसलिए यदि comapnyid = 1:

 companyID IN ('1,2,3') 

यह वापस सच है

लेकिन अगर संख्या 1 पहली जगह में नहीं है

  companyID IN ('2,3,1') 

इसकी वापसी झूठी

सभी संबंधित कंपनियों का नाम प्राप्त करने के लिए, विशेष आईडी पर आधारित नहीं

 SELECT (SELECT GROUP_CONCAT(cmp.cmpny_name) FROM company cmp WHERE FIND_IN_SET(cmp.CompanyID, odr.attachedCompanyIDs) ) AS COMPANIES FROM orders odr 

क्योंकि दूसरी क्वेरी आईडी 1 या 2 या 3 के साथ पंक्तियों की तलाश कर रही है, पहली क्वेरी कंपनी आईडी में मौजूद अल्पविराम से सीमांकित मानों में से एक की तलाश कर रही है,

और यहां एक और समस्या यह है कि आप तालिकाओं में एक आम कुंजी पर शामिल नहीं हो रहे हैं, जहां आप पंक्तियों का एक उत्परिवर्तन प्राप्त करने जा रहे हैं, जो = गिनती (तालिका 1) * गिनती (तालिका 2);

आपकी समस्या वास्तव में मेरे उत्तर के भाग 2 के साथ मौजूद है (आपकी दूसरी क्वेरी के साथ)

मुझे बताएं कि FIND_IN_SET का उपयोग कब और IN का उपयोग करने के दौरान।

चलो टेबल ए लेते हैं जिसका नाम "सहायता", "एनाम" नामक कॉलम है। चलो टेबल बी लेते हैं जिसका नाम "bid", "bname", "एड्स" नामक कॉलम है।

अब तालिका ए और टेबल बी में डमी वैल्यू नीचे दिए गए हैं।

टेबल ए

सहायता aname

1 एप्पल

2 केले

3 आम

टेबल बी

बोली लगाने वाले एड्स

1 एपल 1,2

2 केले 2.1

3 आम 3,1,2

 enter code here 

Case1: यदि आप उन रिकॉर्ड्स को तालिका से प्राप्त करना चाहते हैं जो एड्स कॉलम में 1 मान मौजूद है, तो आपको FIND_IN_SET का उपयोग करना होगा

प्रश्न: * एक से जुड़ें FIND_IN_SET (एएड, बी.आई.एस.) पर * एआइडी = 1;

केस 2: यदि आप उन रिकॉर्ड्स को तालिका से प्राप्त करना चाहते हैं जिसमें 1 या 2 या 3 मूल्य सहायता कॉलम में मौजूद हैं, तो आपको IN का उपयोग करना होगा।

प्रश्न: * एक संयुक्त बी ओएएड इन (बी। में) से चुनें *;

अब आपके यहां तक ​​कि मेरी एसक्यूएल क्वेरी के ज़रिए आपको क्या चाहिए।

 SELECT o.*, GROUP_CONCAT(c.name) FROM Orders AS o , Company.c WHERE FIND_IN_SET(c.CompanyID , o.attachedCompanyIDs) GROUP BY o.attachedCompanyIDs