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

PHP और Mysql क्वेरी, पंक्ति को कॉलम में बदलने के लिए PHP का उपयोग करें

SQL क्वेरी का उपयोग करके परिणाम प्राप्त करना संभव है, लेकिन यह मामूली नहीं है।

लेकिन इससे पहले कि आप उस मार्ग पर जाएं, मेरा सुझाव है कि आप एक अलग दृष्टिकोण पर विचार करें।

चूंकि क्वेरी पंक्तियों का एक अपेक्षाकृत छोटा सेट लौटा रही है, आप इसके बजाय पूरे परिणाम को PHP में दो आयामी सरणी के रूप में पुनः प्राप्त कर सकते हैं।

उदाहरण के तौर पर एक बहुत ही साधारण मामले पर विचार करें:

SELECT foo, fee, fi, fo, fum
  FROM mytable 
 ORDER BY foo

foo fee fi  fo  fum
--- --- --- --- ---
ABC   2   3   5   7
DEF  11  13  17  19

हम एक fetchAll कर सकते हैं, और दो आयामी सरणी प्राप्त कर सकते हैं, फिर सरणी के माध्यम से लूप कर सकते हैं और पंक्ति-वार के बजाय मान कॉलम-वार पुनर्प्राप्त कर सकते हैं। एक विकल्प यह है कि हम प्राप्त होने वाले सरणी को एक नए सरणियों में बदल दें जो इस तरह दिखती हैं:

bar  ABC  DEF
---  ---  ---
fee    2   11
fi     3   13
fo     5   17
fum    7   19

परिवर्तन करना वास्तव में आवश्यक नहीं है, आप मूल सरणी पर चल सकते हैं। लेकिन परिवर्तन को एक अलग चरण के रूप में अलग करना संभवतः आपके कोड को थोड़ा आसान बना देगा, जब आप वास्तव में पृष्ठ में आउटपुट उत्पन्न करते हैं। (यह एक सामान्य पर्याप्त समस्या की तरह लगता है कि किसी ने शायद एक ऐसा फ़ंक्शन लिखा है जो आपके इच्छित सरणी परिवर्तन करता है। मुझे नहीं लगता कि कोई PHP अंतर्निहित है जो इसे करता है।

शीर्षक:

array { [0]=>'bar'  [1]=>'ABC'  [2]=>'DEF' }

पंक्तियाँ:

array {
  [0]=>array { [0]=>'fee'   [1]=>'2'  [2]=>'11' }
  [1]=>array { [0]=>'fi'    [1]=>'3'  [2]=>'13' }
  [2]=>array { [0]=>'fo'    [1]=>'5'  [2]=>'17' }
  [3]=>array { [0]=>'fum'   [1]=>'7'  [2]=>'19' }
}

आपके जैसी पंक्तियों के एक छोटे से सेट के लिए, मैं इसे SQL के बजाय PHP में करने का विकल्प चुनूंगा।

लेकिन आपने पूछा कि इसे SQL में कैसे करें। जैसा कि मैंने पहले कहा, यह मामूली नहीं है।

SQL के लिए आवश्यक है कि SELECT स्टेटमेंट लौटाए जाने वाले प्रत्येक कॉलम को परिभाषित करे; कथन निष्पादित होने पर कॉलम की संख्या और प्रकार गतिशील नहीं हो सकते हैं।

यदि हम एक और क्वेरी (मूल क्वेरी के अलावा) बनाते हैं जो कॉलम को परिभाषित करती है, और उन पंक्तियों को लौटाती है जिनकी हम मूल्यों के लिए प्लेसहोल्डर के साथ वापसी की उम्मीद करते हैं, तो हम आधे रास्ते में हैं। जो कुछ बचा है वह मूल क्वेरी द्वारा लौटाई गई पंक्तियों में बाहरी जुड़ाव करना है, और सशर्त रूप से उपयुक्त पंक्तियों पर कॉलम मान वापस करना है।

यह दृष्टिकोण काम करता है यदि आपके पास पंक्तियों और स्तंभों का एक पूर्व-निर्धारित सेट है जिसे हमें वापस करने की आवश्यकता है, खासकर जब मूल पंक्ति स्रोत विरल है, और हमें "लापता" पंक्तियों को उत्पन्न करने की आवश्यकता है। (उदाहरण के लिए, ऑर्डर किए गए उत्पादों की संख्या प्राप्त करना, और बहुत सारी अनुपलब्ध पंक्तियाँ हैं, अनुपलब्ध पंक्तियों को उत्पन्न करने का कोई अच्छा तरीका नहीं है।

उदाहरण के लिए:

SELECT r.bar
     , '' AS `ABC`
     , '' AS `DEF`
  FROM ( SELECT 'fee' AS bar
          UNION ALL SELECT 'fi'
          UNION ALL SELECT 'fo'
          UNION ALL SELECT 'fum'
       ) r
 GROUP BY r.bar

वह वापस आ जाएगा:

 bar  ABC  DEF
 ---  ---  ---
 fee
 fi
 fo
 fum

तो, यह हमें सभी कॉलम परिभाषित करता है, और उन सभी पंक्तियों को जिन्हें हम वापस करना चाहते हैं। पहला कॉलम आबाद है। उस क्वेरी को वास्तव में अभी तक GROUP BY की आवश्यकता नहीं है, लेकिन "वास्तविक" स्रोत परिणाम सेट से पंक्तियों से मेल खाने के बाद हमें इसकी आवश्यकता होगी।

"ट्रिक" अब हमारे स्रोत से पंक्तियों का मिलान कर रही है, और उपयुक्त परिस्थितियों के आधार पर एक कॉलम से मान लौटा रही है।

हम जो उत्पन्न करने जा रहे हैं, वह अनिवार्य रूप से एक परिणाम सेट है जो इस तरह दिखता है:

bar  foo  ABC  DEF
---  ---  ---  ---
fee  ABC    2
fee  DEF        11
fi   ABC    3
fi   DEF        13
fo   ABC    5
fo   DEF        15
fum  ABC    7
fum  DEF        17

फिर हम परिणामसेट से foo कॉलम को हटाकर और bar पर GROUP BY करके, पंक्तियों को "संक्षिप्त" करने जा रहे हैं। . हम एक समग्र फ़ंक्शन (या तो MAX या SUM) का उपयोग करने जा रहे हैं, जो इस तरह से परिणाम उत्पन्न करने के लिए NULL मानों के साथ किए गए हैंडलिंग का लाभ उठाते हैं:

bar  foo  ABC  DEF
---  ---  ---  ---
fee         2   11
fi          3   13
fo          5   15
fum         7   17

इसके बजाय बोझिल SQL का उपयोग करना:

SELECT r.bar
     , MAX(CASE WHEN t.foo = 'ABC' THEN CASE r.bar 
         WHEN 'fee' THEN t.fee 
         WHEN 'fi'  THEN t.fi
         WHEN 'fo'  THEN t.fo
         WHEN 'fum' THEN t.fum
       END END) AS 'ABC'
     , MAX(CASE WHEN t.foo = 'DEF' THEN CASE r.bar 
         WHEN 'fee' THEN t.fee 
         WHEN 'fi'  THEN t.fi
         WHEN 'fo'  THEN t.fo
         WHEN 'fum' THEN t.fum
       END END) AS 'DEF'
  FROM ( SELECT 'foo' AS col
          UNION ALL SELECT 'fee'
          UNION ALL SELECT 'fi'
          UNION ALL SELECT 'fo'
          UNION ALL SELECT 'fum'
       ) r
 CROSS
  JOIN mysource t
 GROUP BY r.bar

ध्यान दें कि mysource उपरोक्त क्वेरी में एक इनलाइन दृश्य के साथ प्रतिस्थापित किया जा सकता है, एक उपयुक्त क्वेरी के चारों ओर पैरेंस लपेटकर जो पंक्तियों को हम चाहते हैं।

इनलाइन दृश्य को r . के रूप में उपनामित किया गया है उन पंक्तियों को वापस करने का हमारा स्रोत है जिन्हें हम वापस करना चाहते हैं।

प्रत्येक पंक्ति में प्रत्येक कॉलम के लिए सही मान चुनने के लिए, SELECT सूची में भाव सशर्त परीक्षण कर रहे हैं।

CASE कथनों के नियमित पैटर्न को देखते हुए, क्वेरी उत्पन्न करने में सहायता के लिए कुछ SQL का उपयोग करना संभव है, लेकिन इसे एक अलग चरण के रूप में करना होगा। उस SQL ​​​​से आउटपुट का उपयोग हमें आवश्यक वास्तविक क्वेरी बनाने में मदद के लिए किया जा सकता है।

आपके मामले में, यह देखते हुए कि workdate कॉलम हेडर के लिए आप जो उपयोग करना चाहते हैं, वह संभवतः गतिशील रूप से उत्पन्न होने वाला है। (आप उस दूसरे कॉलम 'सप्ताह के दिन' कॉलम को मूल स्रोत क्वेरी से हटा सकते हैं, और उसे बाहरी क्वेरी पर ले जा सकते हैं।

अगर मुझे workdate का पता नहीं होता क्वेरी चलाने से पहले शीर्षकों के लिए मान, फिर मैं एक अस्थायी तालिका बनाने और मूल क्वेरी से परिणामों के साथ इसे पॉप्युलेट करने का विकल्प चुनूंगा, और फिर workdate प्राप्त करने के लिए अस्थायी तालिका को क्वेरी करूंगा। शीर्षलेख, और पंक्तियों को उत्पन्न करने के लिए "पहला कॉलम"। तब मैं अस्थायी तालिका के विरुद्ध वास्तविक क्वेरी चलाऊंगा।

दोहराने के लिए, मुझे लगता है कि आप SQL में करने की कोशिश करने के बजाय PHP में अपनी मूल क्वेरी से परिणामों का परिवर्तन/धुरी करना बेहतर होगा।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं मैसकल में देशांतर/अक्षांश मानों का कुशलतापूर्वक उपयोग कैसे करूं?

  2. MySQL कनेक्शन काम नहीं कर रहा:2002 ऐसी कोई फ़ाइल या निर्देशिका नहीं

  3. त्रुटि 1005 (HY000):तालिका नहीं बना सकता (त्रुटि:150)

  4. कॉमा सेपरेटेड स्ट्रिंग SQL PHP के साथ वैल्यू की तुलना करें

  5. कमांड लाइन का उपयोग करके डेटाबेस को कैसे निर्यात करें