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

MySQL त्रुटि:चयन सूची समूह द्वारा खंड में नहीं है

जब आप ग्रुप बाय का उपयोग करते हैं, तो आप अपनी चयन-सूची में अभिव्यक्तियों का उपयोग केवल तभी कर सकते हैं जब उनके पास प्रति समूह एक ही मान हो। अन्यथा आपको अस्पष्ट क्वेरी परिणाम मिलते हैं।

आपके मामले में, 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;

मैंने आपके जॉइन को भी उचित तरीके से दोबारा लिखा है। अल्पविराम-शैली में शामिल होने से बचना चाहिए।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. LOAD DATA LOCAL INFILE को पकड़ने में त्रुटि का सबसे अच्छा तरीका?

  2. रिवर्स इंजीनियर MySQL और PostgreSQL डीबी के लिए आवेदन?

  3. MySQL - मारियाडीबी - बहुत पहले संग्रहित प्रक्रिया लिखना

  4. अनुक्रमित फ़ील्ड पर चयन करते समय IN(...) का उपयोग क्यों चयन क्वेरी के प्रदर्शन को मार देगा?

  5. एक अतिरिक्त पिवट टेबल कॉलम का मूल्य प्राप्त करना