यह एक पीडीओ सीमा नहीं है, यह MySQL क्लाइंट लाइब्रेरी की एक सीमा है। MySQL एक समय में केवल एक ही क्वेरी का समर्थन करता है। आप दूसरी क्वेरी निष्पादित नहीं कर सकते, जबकि पहली क्वेरी में अभी भी एक खुला कर्सर है (अर्थात इसके परिणाम अभी भी वापस आने हैं)।
आपके पास ये विकल्प हैं:
-
PDOStatement::fetchAll() का उपयोग करें और एक PHP सरणी में बाहरी क्वेरी का पूरा परिणाम सेट एकत्र करें। यह बाहरी क्वेरी के क्वेरी परिणाम को पूरा करता है। फिर आप सरणी पर लूप कर सकते हैं और प्रत्येक लूप पुनरावृत्ति के लिए एक अतिरिक्त SQL क्वेरी चला सकते हैं।
लेकिन बाहरी परिणाम सेट के प्रत्येक लूप पुनरावृत्ति के लिए एक नई क्वेरी चलाना कुशल नहीं है। यह आपके आवेदन के प्रदर्शन को खत्म करने का एक अच्छा तरीका है।
कुछ लोग इसे N+1 Selects Problem क्योंकि आप पहले चयन को चलाते हैं, जो N पंक्तियाँ लौटाता है, और फिर आप पहले चयन के परिणामों के आधार पर N चयन चलाते हैं।
-
यदि आप MySQL का उपयोग करते हैं, तो PDO::MYSQL_ATTR_USE_BUFFERED_QUERY का उपयोग करें। जो मूल रूप से वही काम करता है, आंतरिक रूप से एक सरणी में सहेजी गई सभी पंक्तियों को डाउनलोड करता है। फिर बाद में
fetch()
. पर कॉल करें बफ़र किए गए परिणामों पर बस पुनरावृति करें।लेकिन इसमें N+1 Selects antipattern भी शामिल है।
-
एक एकल SQL क्वेरी लिखना बेहतर है जो आपको वह मान देता है जो आप चाहते हैं। आपकी टिप्पणियों से अनुमान लगाते हुए, आप किसी अन्य तालिका से श्रेणियां और संबंधित पंक्तियों की संख्या चाहते हैं जहां category_id मेल खाता है। यहां ऐसी SQL क्वेरी का एक उदाहरण दिया गया है:
$db->pquery("SELECT c.`category_id`, c.`category_name`, COUNT(*) AS `count` FROM `database_categorys` AS c LEFT OUTER JOIN `other_table` AS t ON t.category_id = c.category_id GROUP BY c.category_id ORDER BY c.`category_name` ASC");
जॉइन SQL का एक मूलभूत हिस्सा हैं। यदि आप जॉइन का उपयोग करना सीखे बिना SQL का उपयोग करने का प्रयास करते हैं, तो यह while
का उपयोग करना सीखे बिना PHP का उपयोग करने जैसा है लूप।
यहां प्रारंभ करें:एक दृश्य व्याख्या एसक्यूएल जुड़ता है ।