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 में अपनी मूल क्वेरी से परिणामों का परिवर्तन/धुरी करना बेहतर होगा।