मेरे पास इस तरह की एक टेबल है:

+-----------------------------------------------+
| id  | name    | text              | fieldname |
+-----------------------------------------------+
| 1   | item_1  | Title For Item 1  | title     |
| 2   | item_1  | Body For Item 1   | body      |
| 3   | item_2  | Title For Item 2  | title     |
| 4   | item_2  | Body For Item 2   | body      |
+-----------------------------------------------+

यह एक ही वस्तु के दो भागों को दो अलग-अलग पंक्तियों में संग्रहीत करता है। वे कॉलम name से संबंधित हैं।

मुझे एक ही आइटम के लिए दोनों पंक्तियों से टेक्स्ट पुनर्प्राप्त करने की आवश्यकता है, लेकिन एक ही पंक्ति पर। मैं इस तरह के परिणाम के साथ समाप्त करना चाहता हूं:

+---------------------------------------------------+
| name      | title             | text              |
+---------------------------------------------------+
| item_1    | Title For Item 1  | Body For Item 1   |
| item_2    | Title For Item 2  | Body For Item 2   |
+---------------------------------------------------+

मुझे यह समझने में कठिन समय हो रहा है कि इसे पूरा करने के लिए एक कथन कैसे बनाया जाए। मैसकल मेरी ताकत नहीं है। मैंने अब तक जितने भी संसाधन देखे हैं, यह सुझाव देते हैं कि यह उतना ही सरल है जितना कि मेल खाने वाले कॉलम पर किसी तालिका को स्वयं से जोड़ना। हालांकि जब मैं इसे इस तरह कोशिश करता हूं, तो मुझे डेटा के डुप्लीकेट मिलते हैं, और मुझे जो चाहिए वह बिल्कुल नहीं:

SELECT
    t1.name as 'Name',
    t1.text as 'Title',
    t2.text as 'Body'
from test t2
inner join test t1
on t2.name = t1.name

उपरोक्त आउटपुट इस तरह हैं:

+---------------------------------------------------+
| name      | title             | text              |
+---------------------------------------------------+
| item_1    | Title For Item 1  | Title For Item 1  |
| item_1    | Title For Item 1  | Body For Item 1   |
| item_1    | Body For Item 1   | Title For Item 1  |
| item_1    | Body For Item 1   | Body For Item 1   |
+---------------------------------------------------+
0
Rolodex McGee 29 जुलाई 2019, 21:13

1 उत्तर

सबसे बढ़िया उत्तर

एक शामिल होना आवश्यक नहीं है। हम SELECT सूची में अभिव्यक्तियों में शर्तों का उपयोग कर सकते हैं, कुछ इस तरह:

SELECT t.name                                                        AS `Name`
     , MAX(CASE t.fieldname WHEN 'title'  THEN t.text ELSE NULL END) AS `Title`
     , MAX(CASE t.fieldname WHEN 'body'   THEN t.text ELSE NULL END) AS `Body`
  FROM test t
 GROUP
    BY t.name

ध्यान दें कि यह प्रत्येक "नाम" मान के लिए एक पंक्ति लौटाएगा, भले ही ऐसी कोई पंक्तियाँ न हों जिनमें 'शीर्षक' और/या 'बॉडी' के "फ़ील्डनाम" मान हों।

यदि हम केवल उन पंक्तियों को वापस करना चाहते हैं जिनमें 'शीर्षक' और 'बॉडी' के "फ़ील्डनाम" मान हैं, तो हम WHERE क्लॉज जोड़ सकते हैं

WHERE t.fieldname IN ('title','body')

अगर हम यह सुनिश्चित करना चाहते हैं कि हमारे पास 'शीर्षक' और 'बॉडी' दोनों हैं (जो कि INNER JOIN ने किया होगा) तो हम इसे HAVING क्लॉज में कर सकते हैं

HAVING 2 = COUNT(DISTINCT IF(t.fieldname IN ('title','body'),t.fieldname,NULL))

लेकिन अगर कोई कारण है कि हमें जॉइन ऑपरेशन का उपयोग करना है, तो हम ऐसी स्थितियां शामिल कर सकते हैं जो पंक्तियों को 'शीर्षक' और 'बॉडी' के "फ़ील्डनाम" मानों तक सीमित कर दें।

SELECT t1.name  AS `Name`
     , t1.text  AS `Title`
     , t2.text  AS `Body`
  FROM test t1
  JOIN test t2
    ON t2.name = t1.name
   AND t2.fieldname = 'body'
 WHERE t1.fieldname = 'title'

यदि कोई मौका है कि हमारे पास 'बॉडी' और 'शीर्षक' के साथ कई पंक्तियाँ हैं, और हम किसी दिए गए "नाम" के लिए केवल एक ही पंक्ति वापस करना चाहते हैं, तो हम चयन सूची में एक ग्रुप बाय और एग्रीगेट जोड़ सकते हैं

SELECT t1.name       AS `Name`
     , MAX(t1.text)  AS `Title`
     , MAX(t2.text)  AS `Body`
  FROM test t1
  JOIN test t2
    ON t2.name = t1.name
   AND t2.fieldname = 'body'
 WHERE t1.fieldname = 'title'
 GROUP
    BY t1.name
3
spencer7593 29 जुलाई 2019, 21:29