जब आप ग्रुप बाय का उपयोग करते हैं, तो आप अपनी चयन-सूची में अभिव्यक्तियों का उपयोग केवल तभी कर सकते हैं जब उनके पास प्रति समूह एक ही मान हो। अन्यथा आपको अस्पष्ट क्वेरी परिणाम मिलते हैं।
आपके मामले में, MySQL का मानना है कि s.status
प्रति समूह कई मान हो सकते हैं। उदाहरण के लिए, आप p.products_id
. के आधार पर समूह बना रहे हैं लेकिन s.status
किसी अन्य तालिका में एक स्तंभ है specials
, शायद तालिका products
. के साथ एक-से-अनेक संबंध में . तो specials
. में कई पंक्तियाँ हो सकती हैं उसी products_id
. के साथ , लेकिन status
. के लिए भिन्न मान . अगर ऐसा है, तो status
. के लिए कौन सा मान क्या क्वेरी का उपयोग करना चाहिए? यह अस्पष्ट है।
आपके डेटा में, आप पंक्तियों को इस तरह सीमित कर सकते हैं कि आपके पास specials
. में केवल एक पंक्ति हो products
. में प्रत्येक पंक्ति के लिए . लेकिन MySQL यह धारणा नहीं बना सकता।
MySQL 5.6 और इससे पहले आपको ऐसे अस्पष्ट प्रश्न लिखने देते हैं, यह विश्वास करते हुए कि आप जानते हैं कि आप क्या कर रहे हैं। लेकिन MySQL 5.7 डिफ़ॉल्ट रूप से अधिक सख्त प्रवर्तन को सक्षम बनाता है (इसे पिछले संस्करणों की तरह व्यवहार करने के लिए कम सख्त बनाया जा सकता है)।
इस नियम का पालन करना ठीक है:आपकी चयन-सूची में प्रत्येक कॉलम तीन मामलों में से एक में आना चाहिए:
- कॉलम COUNT(), SUM(), MIN, MAX(), AVERAGE(), या GROUP_CONCAT() जैसे समग्र फ़ंक्शन के अंदर है।
- कॉलम
GROUP BY
में नामित कॉलम में से एक है खंड। - कॉलम कार्यात्मक रूप से
GROUP BY
में नामित कॉलम पर निर्भर है। खंड।
अधिक स्पष्टीकरण के लिए इस बेहतरीन ब्लॉग को पढ़ें:डिबंकिंग ग्रुप बाय मिथ्सए>
अपनी टिप्पणी दें, मैं केवल अनुमान लगा सकता हूं क्योंकि आपने अपनी तालिका परिभाषाएं पोस्ट नहीं की हैं।
मेरा अनुमान है कि products_description
और manufacturers
कार्यात्मक रूप से products
. पर निर्भर हैं , इसलिए उन्हें चयन-सूची में सूचीबद्ध करना ठीक है। लेकिन यह धारणा सही नहीं हो सकती है, मुझे आपकी स्कीमा का पता नहीं है।
वैसे भी, s.status
. के बारे में त्रुटि एक समग्र फ़ंक्शन का उपयोग करके हल किया जाना चाहिए। मैं MAX()
का उपयोग कर रहा हूं एक उदाहरण के रूप में।
SELECT p.*,
pd.*,
m.*,
MAX(IF(s.status, s.specials_new_products_price, NULL))
AS specials_new_products_price,
MAX(IF(s.status, s.specials_new_products_price, p.products_price))
AS final_price
FROM products p
LEFT OUTER JOIN specials s ON p.products_id = s.products_id
INNER JOIN manufacturers m ON p.manufacturers_id = m.manufacturers_id
INNER JOIN products_description pd ON p.products_id = pd.products_id
INNER JOIN products_to_categories p2c ON p.products_id = p2c.products_id
INNER JOIN categories c ON p2c.categories_id = c.categories_id
WHERE p.products_view = 1
AND p.products_status = 1
AND p.products_archive = 0
AND c.virtual_categories = 0
AND pd.language_id = 1
GROUP BY p.products_id;
मैंने आपके जॉइन को भी उचित तरीके से दोबारा लिखा है। अल्पविराम-शैली में शामिल होने से बचना चाहिए।